Как получить уникальный ключ для двух полей с Hibernate? - PullRequest
22 голосов
/ 03 июня 2009

У меня есть два поля класса сущностей, которые я не хочу быть уникальными, но вместо этого я буду использовать их как составные поля для ключа, который сам должен быть уникальным. Например, у меня есть два поля (имя и версия), которые могут быть одинаковыми для других записей, но вместе они должны быть уникальными. Каков наилучший способ сделать это с помощью Hibernate (с аннотациями)? Я использую Hibernate Validator для других полей, но я не уверен, как использовать его для проверки того, что два поля вместе составляют уникальный ключ. Я использую универсальный класс сущностей, который имеет универсальный тип id, который можно поменять на класс составного ключа, но мне еще предстоит заставить его работать очень хорошо.

Ответы [ 2 ]

38 голосов
/ 03 июня 2009

Это создаст уникальный ключ в базе данных:

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

Это будет применяться базой данных при обновлении или сохранении.

Вам нужно написать свой собственный валидатор, если вы хотите применить его с помощью Hibernate Validator.

4 голосов
/ 03 февраля 2010

Обычно мы оборачиваем два поля во внутренний класс ключей, помеченный как @Embeddable. Например:

@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
  }
}
...