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