118

@UniqueConstraint@Column(unique = true)の違いは何ですか?

例えば:

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
4

4 に答える 4

177

前に述べたように、それが単一のフィールドしかない場合@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;

このコードは、との両方が一意である必要があることを意味しますmaskgroup、別々である必要があります。つまり、たとえば、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")
        }
)

これは、最初のコードブロックと同じ効果があります。

于 2016-04-29T18:23:59.593 に答える
27

Java EEドキュメントから:

public abstract boolean unique

(オプション)プロパティが一意キーであるかどうか。これは、テーブルレベルでのUniqueConstraintアノテーションのショートカットであり、一意キー制約が単一のフィールドのみである場合に役立ちます。この制約は、主キーマッピングに伴う制約、およびテーブルレベルで指定された制約に加えて適用されます。

ドキュメントを参照してください

于 2013-03-12T21:39:19.120 に答える
25

ボアズの答えに加えて…。

@UniqueConstraintランダムな名前を生成しながら、制約に名前を付けることができます(例)。@Column(unique = true)UK_3u5h7y36qqa13y3mauc5xxayq

制約がどのテーブルに関連付けられているかを知ることが役立つ場合があります。例えば:

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {
      @UniqueConstraint(
          columnNames = {"mask", "group"},
          name="uk_product_serial_group_mask"
      )
   }
)
于 2015-12-03T17:46:28.820 に答える
6

@Boazと@vegemite4meの回答に加えて....

実装ImplicitNamingStrategyすることにより、制約に自動的に名前を付けるためのルールを作成できます。metadataBuilderHibernateの初期化中に名前付け戦略を追加することに注意してください。

metadataBuilder.applyImplicitNamingStrategy(new MyImplicitNamingStrategy());

これは、に対しては機能しますが、常にランダムな名前を生成する(たとえば、UK_3u5h7y36qqa13y3mauc5xxayq)@UniqueConstraintに対しては機能しません。@Column(unique = true)

この問題を解決するためのバグレポートがありますので、可能であれば、投票して実装してください。ここ: https ://hibernate.atlassian.net/browse/HHH-11586

ありがとう。

于 2017-06-27T20:05:37.567 に答える