Như đã nói trước đây, @Column(unique = true)
là một phím tắt để UniqueConstraint
khi nó chỉ là một lĩnh vực 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 rẽ. Điều đó có nghĩa là, ví dụ: nếu bạn có bản ghi có mặt nạ .id = 1 và cố gắng chèn một bản ghi khác với mask.id = 1, bạn sẽ gặp lỗi, vì cột đó phải có giá trị duy nhất . Cùng một cách 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 kết hợp phải là duy nhất. Điều đó có nghĩa bạn có thể có, ví dụ, một kỷ lục với mask.id = 1 và group.id = 1, và nếu bạn cố gắng để chèn 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 nó sẽ không.
Nếu bạn muốn có cả mặt nạ và nhóm phải 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")
}
)
này có tác dụng tương tự như khối mã đầu tiên.
Lưu ý: Với Hibernate 5.4, khi tôi thêm 'unique = true', chỉ mục không được thêm vào bởi chương trình tự động cập nhật. '@ UniqueConstraint' làm cho nó xuất hiện. Có thể là một lỗi. –