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

时间:2009-06-03 18:56:50

标签: java hibernate orm jpa annotations

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

2 个答案:

答案 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
  }
}