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

plo*_*ouh 79 java mapping 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

psp*_*psp 159

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

@Entity
@Table(uniqueConstraints={
    @UniqueConstraint(columnNames = {"productId", "serial"})
}) 
public class InventoryItem {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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


SJh*_*Jha 62

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

@Column(name="product_id")
Long productId;
Run Code Online (Sandbox Code Playgroud)

然后@Table注释应如下所示

@Table(uniqueConstraints=
       @UniqueConstraint(columnNames = {"product_id", "serial"}) 
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常重要的说明:表名而不是对象名. (7认同)