Như đã nói trước đây, @Column(unique = true)
là một phím tắt UniqueConstraint
khi nó chỉ là một trường duy nhất.
Từ ví dụ bạn đưa ra, có sự khác biệt rất lớn giữa cả hai.
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
Mã này ngụ ý rằng cả hai mask
và group
phải là duy nhất, nhưng riêng biệt. Điều đó có nghĩa là nếu bạn có một bản ghi với mask.id = 1 và cố gắng chèn một bản ghi khác có mask.id = 1 , thì bạn sẽ gặp lỗi vì cột đó phải có các giá trị duy nhất. Ứng dụng tương tự cho nhóm.
Mặt khác,
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
Ngụ ý rằng các giá trị của mặt nạ + nhóm được kết hợp phải là duy nhất. Điều đó có nghĩa là bạn có thể có, ví dụ, một bản ghi với mask.id = 1 và group.id = 1 , và nếu bạn cố gắng chèn một bản ghi khác với mask.id = 1 và group.id = 2 , nó sẽ được chèn thành công, trong khi trong trường hợp đầu tiên thì không.
Nếu bạn muốn có cả mặt nạ và nhóm là duy nhất riêng biệt và ở cấp lớp, bạn phải viết mã như sau:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
Điều này có tác dụng tương tự như khối mã đầu tiên.
unique=true
, chỉ mục không được thêm bởi trình cập nhật tự động lược đồ.@UniqueConstraint
làm cho nó xuất hiện. Có thể là một lỗi.