前に述べたように、それが単一のフィールドしかない場合@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")
}
)
これは、最初のコードブロックと同じ効果があります。