前に述べたように、それが単一のフィールドのみの場合の@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
それを出現させた。バグかもしれません。