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

2022-08-31 09:48:27

我正在尝试在 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?


答案 1

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

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

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


答案 2

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

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

然后注释应如下所示@Table

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

推荐