我试图在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?
答案 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"})