Bagaimana cara memperkenalkan batasan multi-kolom dengan anotasi JPA?


91

Saya mencoba memperkenalkan batasan multi-kunci pada entitas yang dipetakan JPA:

public class InventoryItem {
    @Id
    private Long id;

    @Version 
    private Long version;

    @ManyToOne
    @JoinColumn("productId")
    private Product product;

    @Column(nullable=false);
    private long serial;
}

Pada dasarnya pasangan (produk, serial) harus unik, tetapi saya hanya menemukan cara untuk mengatakan bahwa serial harus unik. Ini jelas bukan ide yang bagus karena produk yang berbeda mungkin memiliki nomor seri yang sama.

Apakah ada cara untuk menghasilkan batasan ini melalui JPA atau saya terpaksa membuatnya secara manual ke DB?

Jawaban:


191

Anda dapat mendeklarasikan batasan unik menggunakan @Table(uniqueConstraints = ...)anotasi di kelas entitas Anda, yaitu

@Entity
@Table(uniqueConstraints={
    @UniqueConstraint(columnNames = {"productId", "serial"})
}) 
public class InventoryItem {
    ...
}

Perhatikan bahwa ini tidak secara ajaib membuat batasan unik dalam database, Anda masih memerlukan DDL untuk membuatnya. Tapi sepertinya Anda menggunakan semacam alat otomatis untuk membuat database berdasarkan definisi entitas JPA.


1
Apakah hal semacam ini diperlukan untuk database yang sudah ada dengan batasan yang sudah ada?
Rob

Saya percaya bahwa batasan akan dibuat oleh penyedia JPA yang membuat basis data.
AlanObject

Keunikannya adalah untuk kolom (productId) & (serial) column atau untuk batasan 2 kolom secara total (productId, serial)?
P Satish Patro

69

Seperti yang sudah dijawab, indeks multi-kolom dapat ditambahkan menggunakan @Tableanotasi. Namun, columnNamesharus berupa nama kolom DB yang sebenarnya, bukan atribut kelasnya. Jadi, jika kolomnya seperti berikut:

@Column(name="product_id")
Long productId;

Maka @Tableanotasinya akan seperti berikut

@Table(uniqueConstraints=
       @UniqueConstraint(columnNames = {"product_id", "serial"}) 

10
Ini adalah klarifikasi yang sangat penting: nama tabel dan bukan nama objek.
Calabacin

1
Keunikannya adalah untuk kolom (productId) & (serial) column atau untuk batasan 2 kolom secara total (productId, serial)?
P Satish Patro

Kotlin: Lihatlah jawaban ini untuk menemukan contoh kotlin: stackoverflow.com/a/47000044/285431
Dirk

Kesalahan sintaks. Anda kehilangan tanda kurung tutup pada anotasi @Table.
Evvo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.