web-dev-qa-db-ja.com

Hibernateで2つのフィールドの一意のキーを取得するにはどうすればよいですか?

エンティティクラスの2つのフィールドがありますが、これらは一意ではなく、それ自体が一意である必要があるキーの複合フィールドとして使用されます。たとえば、他のレコードで同じにすることができる2つのフィールド(名前とバージョン)がありますが、一緒にすると一意である必要があります。 Hibernate(注釈付き)を使用してそれを行うための最良の方法は何ですか?他のフィールドにHibernateValidatorを使用していますが、2つのフィールドが一緒になって一意のキーを構成していることを検証するためにそれを使用する方法がわかりません。複合キークラスと交換できるidジェネリック型を持つジェネリックエンティティクラスを使用していますが、まだうまく機能していません。

24
James Adams

これにより、データベースに一意のキーが作成されます。

@Table( name = "MYTABLE",
        uniqueConstraints = { @UniqueConstraint( columnNames = { "NAME", "VERSION" } ) } )

これは、更新または永続化時にデータベースによって実施されます。

Hibernate Validatorを使用してこれを強制する場合は、独自のカスタムバリデーターを作成する必要があります。

42
mtpettyp

通常、@ Embeddableとしてマークされた内部キークラスで2つのフィールドをラップします。例えば:

@Entity
public class Foo {

  @EmbeddedId()
  private Key key;
  ...

  @Embeddable
  public static class Key {
    @Column(nullable=false)
    private String name;
    @Column(nullable=false)
    private int version;

    protected Key () {
      // for hibernate
    }
    public Key (String name, int version) {
      this.name = name;
      this.version = version;
    }
    ...
    // You probably want .equals and .hashcode methods
  }
}