我有一个实体类的两个字段,我不希望它们是唯一的,而是用作一个必须本身唯一的键的复合字段。例如,我有两个字段(名称和版本),对于其他记录可以是相同的,但它们必须是唯一的。使用Hibernate(带注释)的最佳方法是什么?我正在使用Hibernate Validator用于其他字段,但我不确定如何使用它来验证两个字段一起组成一个唯一键。我正在使用一个通用实体类,它具有一个id泛型类型,可以换成复合键类,但我还没有把它运行得很好。
答案 0 :(得分:38)
这将在数据库上创建一个唯一键:
@Table( name = "MYTABLE",
uniqueConstraints = { @UniqueConstraint( columnNames = { "NAME", "VERSION" } ) } )
这将由数据库在更新或持久性上强制执行。
如果您想使用Hibernate Validator强制执行此操作,则需要编写自己的自定义验证程序。
答案 1 :(得分:4)
我们通常会将两个字段包装在一个标记为@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
}
}