如何引入JPA批注的多列约束?

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

public class InventoryItem { @Id private Long id; @Version private Long version; @ManyToOne @JoinColumn("productId") private Product product; @Column(nullable=false); private long serial; } 

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

有没有办法通过JPA生成这个约束,或者我被迫手动创build到DB?

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

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

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

正如已经回答的那样,可以使用@Table注释来添加多列索引。 但是, columnNames需要是实际DB列的名称,而不是类属性。 所以,如果这个列如下所示:

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

那么@Table注释应该如下所示

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