Apa perbedaan antara @UniqueConstraint dan @Column (unique = true) ?
Sebagai contoh:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
Dan
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
java
hibernate
hibernate-annotations
navid_gh
sumber
sumber
unique=true
, indeks tidak ditambahkan oleh skema pembaru otomatis.@UniqueConstraint
membuatnya tampak. Bisa jadi bug.Jawaban:
Seperti yang dikatakan sebelumnya,
@Column(unique = true)
ini adalah jalan pintasUniqueConstraint
ketika hanya satu bidang.Dari contoh yang Anda berikan, ada perbedaan besar antara keduanya.
Kode ini menyiratkan bahwa keduanya
mask
dangroup
harus unik, tetapi terpisah. Artinya, jika, misalnya, Anda memiliki record dengan mask.id = 1 dan mencoba memasukkan record lain dengan mask.id = 1 , Anda akan mendapatkan error, karena kolom tersebut harus memiliki nilai yang unik. Hal yang sama berlaku untuk grup.Di samping itu,
Menyiratkan bahwa nilai gabungan mask + group harus unik. Artinya, Anda dapat memiliki, misalnya, catatan dengan mask.id = 1 dan group.id = 1 , dan jika Anda mencoba memasukkan catatan lain dengan mask.id = 1 dan group.id = 2 , itu akan disisipkan berhasil, sedangkan dalam kasus pertama tidak.
Jika Anda ingin mask dan grup menjadi unik secara terpisah dan pada tingkat kelas, Anda harus menulis kode sebagai berikut:
Ini memiliki efek yang sama seperti blok kode pertama.
sumber
mask_id
dangroup_id
jika Anda menggunakan strategi penamaan default.Dari dokumentasi Java EE:
Lihat dok
sumber
Selain jawaban Boas ....
@UniqueConstraint
memungkinkan Anda untuk memberi nama batasan , sementara@Column(unique = true)
menghasilkan nama acak (misalnyaUK_3u5h7y36qqa13y3mauc5xxayq
).Terkadang akan sangat membantu untuk mengetahui tabel apa yang dikaitkan dengan batasan. Misalnya:
sumber
Selain jawaban @ Boaz dan @ vegemite4me ....
Dengan mengimplementasikan
ImplicitNamingStrategy
Anda dapat membuat aturan untuk menamai batasan secara otomatis. Perhatikan Anda menambahkan strategi penamaan Anda kemetadataBuilder
selama inisialisasi Hibernate:Ini berfungsi untuk
@UniqueConstraint
, tetapi tidak untuk@Column(unique = true)
, yang selalu menghasilkan nama acak (misalnya UK_3u5h7y36qqa13y3mauc5xxayq).Ada laporan bug untuk mengatasi masalah ini, jadi jika Anda bisa, silakan pilih di sana untuk menerapkannya. Di sini: https://hibernate.atlassian.net/browse/HHH-11586
Terima kasih.
sumber