代码之家  ›  专栏  ›  技术社区  ›  James Adams

如何获得具有休眠的两个字段的唯一键?

  •  21
  • James Adams  · 技术社区  · 16 年前

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

    2 回复  |  直到 11 年前
        1
  •  38
  •   mtpettyp    16 年前

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

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

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

    如果您想使用Hibernate验证器来强制实现这一点,您需要编写自己的自定义验证器。

        2
  •  4
  •   Gray droiddeveloper    16 年前

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