としては@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"})}
)
を合わせマスク+群の値が一意でなければならないことを意味します。それはあなたが、例えば、= 1mask.id = 1とgroup.idでレコードを持っていることを意味し、そしてあなたは、mask.id = 1とgroup.id =を別のレコードを挿入しようとした場合2の場合は、正常に挿入されますが、最初の場合は挿入されません。
あなたはクラスレベルで個別に及びそれに一意であるためにマスクとグループの両方を持っているしたい場合は、次のようなコードを書く必要があるだろう:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
これは、同じ効果を持っています最初のコードブロック。ボアズの@とvegemite4meの答え@に加えて
注:Hibernate 5.4では、 'unique = true'を追加したとき、インデックスはスキーム自動アップデータによって追加されませんでした。 '@ UniqueConstraint'が現れました。バグかもしれない。 –