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


90

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

Answers:


185

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

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

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


1
现有约束已存在的数据库是否需要这种东西?
罗布

我确实相信将创建约束,JPA提供程序正在创建数据库。
AlanObject

唯一性是针对(productId)列和(serial)列,还是针对总共2列的约束(productId,序列)?
P Satish Patro

68

正如已经回答的,可以使用@Table注释添加多列索引。但是,columnNames必须是实际数据库列的名称,而不是类属性。因此,如果该列如下所示:

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

然后@Table注释应如下所示

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

9
这是非常重要的说明:表名而不是对象名。
卡拉巴辛

1
唯一性是针对(productId)列和(serial)列,还是针对总共2列的约束(productId,序列)?
P Satish Patro

Kotlin:看看这个答案可以找到kotlin的示例:stackoverflow.com/a/47000044/285431
Dirk

语法错误。您缺少@Table注释的右括号。
Evvo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.