Daha önce de söylendiği gibi, yalnızca tek bir alan olduğunda @Column(unique = true)
kısayol UniqueConstraint
.
Verdiğiniz örnekten, ikisi arasında büyük bir fark var.
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
Bu kod hem ima mask
ve group
ayrı ayrı benzersiz olması lazım, ama. Bu, örneğin mask.id = 1 olan bir kaydınız varsa ve mask.id = 1 ile başka bir kayıt eklemeye çalışırsanız , bir hata alacağınız anlamına gelir, çünkü bu sütunun benzersiz değerleri olmalıdır. Aynı şey grup için de geçerlidir.
Diğer yandan,
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
Birleştirilmiş maske + grup değerlerinin benzersiz olması gerektiğini ifade eder. Bu, örneğin mask.id = 1 ve group.id = 1 olan bir kayda sahip olabileceğiniz anlamına gelir ve mask.id = 1 ve group.id = 2 ile başka bir kayıt eklemeye çalışırsanız, bu kayıt eklenecektir başarılı bir şekilde, oysa ilk durumda olmaz.
Hem maskenin hem de grubun ayrı ayrı benzersiz olmasını ve buna sınıf düzeyinde olmasını istiyorsanız, kodu aşağıdaki gibi yazmanız gerekir:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
Bu, ilk kod bloğu ile aynı etkiye sahiptir.
unique=true
, indeks şema otomatik güncelleyici tarafından eklenmedi.@UniqueConstraint
görünmesini sağladı. Bir hata olabilir.