如何使用Hibernate获得两个字段的唯一键?
问题描述:
我有一个实体类的两个领域,我不想是唯一的,而是作为一个键本身必须是唯一的复合领域。例如,我有两个字段(名称和版本),对于其他记录可以是相同的,但它们必须是唯一的。使用Hibernate(带注释)的最佳方式是什么?我在其他领域使用Hibernate Validator,但我不确定如何使用它来验证这两个字段组成一个唯一的密钥。我正在使用一个通用的实体类,它具有一个id泛型类型,可以将其替换为组合键类,但我尚未得到很好的工作。如何使用Hibernate获得两个字段的唯一键?
答
这将创建数据库的唯一关键:
@Table(name = "MYTABLE",
uniqueConstraints = { @UniqueConstraint(columnNames = { "NAME", "VERSION" }) })
这将通过数据库的更新被执行或者坚持。
如果您想使用Hibernate Validator强制执行此操作,您需要编写自己的自定义验证器。
答
我们通常会将这两个字段封装在标记为@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
}
}
您是否希望对两列或包含两列的表上的“主键”设置“唯一约束”? – 2009-06-03 19:54:54
我想在两列上有一个唯一的约束。例如,名称和版本的组合必须是唯一的。所以我可以在表中记录#1(name = abc/version = 1)和记录#2(name = abc/version = 2)中的两条记录,但是表中没有两条记录,记录#1 = abc/version = 1)和记录#2(name = abc/version = 1)。 – 2009-06-08 23:22:03