如何用JPA注释引入多列约束?

时间:2010-05-05 10:46:53

标签: java jpa mapping

我试图在JPA映射的实体上引入一个多键约束:

public class InventoryItem {
    @Id
    private Long id;

    @Version 
    private Long version;

    @ManyToOne
    @JoinColumn("productId")
    private Product product;

    @Column(nullable=false);
    private long serial;
}

基本上(产品,序列)对应该是唯一的,但我只找到了一种说串行应该是唯一的方法。这显然不是一个好主意,因为不同的产品可能具有相同的序列号。

有没有办法通过JPA生成这个约束,还是我被迫手动创建它到DB?

2 个答案:

答案 0 :(得分:144)

您可以使用实体类中的@Table(uniqueConstraints = ...)注释声明唯一约束,即

@Entity
@Table(uniqueConstraints={
    @UniqueConstraint(columnNames = {"productId", "serial"})
}) 
public class InventoryItem {
    ...
}

请注意,这并没有神奇地在数据库中创建唯一约束,您仍然需要一个DDL来创建它。但似乎您正在使用某种自动化工具来创建基于JPA实体定义的数据库。

答案 1 :(得分:54)

如前所述,可以使用@Table注释添加多列索引。但是,columnNames必须是实际DB列的名称,而不是class属性。因此,如果列如下所示:

@Column(name="product_id")
Long productId;

然后@Table注释应该类似于以下

@Table(uniqueConstraints=
       @UniqueConstraint(columnNames = {"product_id", "serial"})