Seperti yang dikatakan sebelumnya, @Column(unique = true)
ini adalah jalan pintas UniqueConstraint
ketika hanya satu bidang.
Dari contoh yang Anda berikan, ada perbedaan besar antara keduanya.
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
Kode ini menyiratkan bahwa keduanya mask
dan group
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,
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
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:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
Ini memiliki efek yang sama seperti blok kode pertama.
unique=true
, indeks tidak ditambahkan oleh skema pembaru otomatis.@UniqueConstraint
membuatnya tampak. Bisa jadi bug.