Подтвердить что ты не робот

Как получить уникальный ключ для двух полей с Hibernate?

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Обычно мы будем обертывать два поля во внутреннем ключевом классе, который помечен как @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
  }
}