如何使用Hibernate获取两个字段的唯一键?

我有一个实体类的两个字段,我不希望它们是唯一的,而是用作一个键的复合字段,它必须是唯一的。 例如,我有两个字段(名称和版本),对于其他记录可以是相同的,但它们必须是唯一的。 使用Hibernate(带注释)的最佳方法是什么? 我正在使用Hibernate Validator用于其他字段,但我不确定如何使用它来validation两个字段一起组成一个唯一键。 我正在使用一个通用的实体类,它具有一个idgenerics类型,可以替换为复合键类,但我还没有让它工作得很好。

这将在数​​据库上创建一个唯一键:

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

这将由数据库在更新或持久性上强制执行。

如果要使用Hibernate Validator强制执行此操作,则需要编写自己的自定义validation程序。

我们通常将两个字段包装在一个标记为@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 } }