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