2009-06-03 119 views
20

我有一个实体类的两个领域,我不想是唯一的,而是作为一个键本身必须是唯一的复合领域。例如,我有两个字段(名称和版本),对于其他记录可以是相同的,但它们必须是唯一的。使用Hibernate(带注释)的最佳方式是什么?我在其他领域使用Hibernate Validator,但我不确定如何使用它来验证这两个字段组成一个唯一的密钥。我正在使用一个通用的实体类,它具有一个id泛型类型,可以将其替换为组合键类,但我尚未得到很好的工作。如何使用Hibernate获得两个字段的唯一键?

+0

您是否希望对两列或包含两列的表上的“主键”设置“唯一约束”? – 2009-06-03 19:54:54

+0

我想在两列上有一个唯一的约束。例如,名称和版本的组合必须是唯一的。所以我可以在表中记录#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

回答

37

这将创建数据库的唯一关键:

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

这将通过数据库的更新被执行或者坚持。

如果您想使用Hibernate Validator强制执行此操作,您需要编写自己的自定义验证器。

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 
    } 
} 
相关问题