ดังที่กล่าวไว้ก่อนหน้า@Column(unique = true)
นี้เป็นทางลัดไปยังUniqueConstraint
เมื่อเป็นเพียงเขตข้อมูลเดียว
จากตัวอย่างที่คุณให้มามีความแตกต่างอย่างมากระหว่างทั้งสองอย่าง
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;
@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
รหัสนี้หมายความว่าทั้งสองmask
และgroup
ต้องไม่ซ้ำกัน แต่แยกกัน นั่นหมายความว่าตัวอย่างเช่นหากคุณมีระเบียนที่มีmask.id = 1และพยายามแทรกระเบียนอื่นด้วยmask.id = 1คุณจะได้รับข้อผิดพลาดเนื่องจากคอลัมน์นั้นควรมีค่าที่ไม่ซ้ำกัน คำพูดเดียวกันสำหรับกลุ่ม
ในทางกลับกัน,
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
หมายความว่าค่าของมาสก์ + กลุ่มที่รวมกันควรไม่ซ้ำกัน นั่นหมายความว่าคุณสามารถมีเช่นบันทึกที่มีmask.id = 1และgroup.id = 1และถ้าคุณพยายามแทรกระเบียนอื่นด้วยmask.id = 1และgroup.id = 2ก็จะถูกแทรก สำเร็จในขณะที่ในกรณีแรกจะทำไม่ได้
หากคุณต้องการให้ทั้งหน้ากากและกลุ่มไม่ซ้ำกันและในระดับชั้นเรียนคุณจะต้องเขียนรหัสดังนี้:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
สิ่งนี้มีผลเช่นเดียวกับบล็อกรหัสแรก
unique=true
ดัชนีจะไม่ถูกเพิ่มโดยตัวอัปเดตอัตโนมัติของแบบแผน@UniqueConstraint
ทำให้มันปรากฏขึ้น อาจเป็นข้อบกพร่อง