Hibernate如何映射仅is_main为true时good_id唯一的约束
在Hibernate中实现部分唯一索引约束
你需要实现的是每个good_id仅允许存在一条is_main=true的记录,对应数据库中通过CREATE UNIQUE INDEX创建的带条件唯一索引,在Hibernate中可以通过其专有注解来映射这个约束,具体实现方式如下:
实现方案
JPA标准注解不支持带条件的唯一约束,因此需要使用Hibernate提供的@Index注解(属于org.hibernate.annotations包),通过指定unique=true和where条件来创建对应的部分唯一索引。
实体类映射示例
import org.hibernate.annotations.Index; import javax.persistence.*; @Entity @Table( name = "image_info", indexes = { @Index( name = "only_one_good_with_is_main_true_uix", columnNames = {"good_id"}, unique = true, where = "is_main = true" ) } ) public class ImageInfo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "is_main") private Boolean isMain; @ManyToOne @JoinColumn(name = "image_id", nullable = false) private Image image; @ManyToOne @JoinColumn(name = "good_id", nullable = false) private Good good; // 构造方法、Getter、Setter 自行补充 }
说明
- 上述注解会让Hibernate在生成表结构时,自动创建和你手动执行SQL完全一致的部分唯一索引;
- 若使用已存在的数据库表,需确保Hibernate的
hibernate.hbm2ddl.auto参数设置为update(仅更新结构)或create-drop(重建表,仅适用于开发环境),或者手动执行索引创建SQL; - 注意
@Index是Hibernate专有注解,不属于JPA标准,若需要跨JPA provider的兼容性,可能需要通过数据库脚本维护的方式实现该约束。
内容的提问来源于stack exchange,提问作者Sergey Bogdanov
相关产品推荐
相关产品推荐

