如何使用Hibernate为两个字段获取唯一密钥?

2022-09-01 14:09:18

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


答案 1

这将在数据库上创建一个唯一的密钥:

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

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

如果要使用休眠验证程序强制执行,则需要编写自己的自定义验证程序。


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

推荐