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?

plouh
sumber

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.

psp
sumber
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"}) 
SJha
sumber
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