Spring Boot中枚举修改后如何自动更新Hibernate Check Constraint?

How to Update Hibernate Check Constraint Automatically After Enum Modification in Spring Boot?

提问人:Mojtaba jalambadani 提问时间:11/10/2023 更新时间:11/10/2023 访问量:29

问:

我有一个使用 Hibernate 的 Spring Boot 应用程序,我最近在其中向实体类 BlockItemEntity 中使用的枚举 ContactTypeConstant 添加了新值。该实体映射到 PostgreSQL 数据库。

下面是实体和枚举的简化版本:

BlockItemEntity:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "block_item", schema = "public")
public class BlockItemEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected long id;
    
    @Column(length = 256)
    private String title; 
    
    @Enumerated(EnumType.STRING)
    private ContactTypeConstant contactType;

}

ContactTypeConstant:

@RequiredArgsConstructor
@Getter
public enum ContactTypeConstant {
    EMAIL(10, "email"),
    PHONE(20, "phone");

    private final long id;
    private final String title;

}

最初,创建数据库约束时未考虑其他枚举值:

ALTER TABLE block_item
    ADD CONSTRAINT block_item_contact_type_check
        CHECK ((contact_type)::text = ANY
               ((ARRAY ['EMAIL'::character varying, 'PHONE'::character varying])::text[]));

后来,我在 ContactTypeConstant 中引入了新的枚举值“MOBILE”和“SMS”。当 Hibernate 尝试使用这些更新的枚举值插入新的 BlockItemEntity 时,我遇到了一个约束冲突错误:

ERROR: new row for relation "block_item" violates check constraint "block_item_contact_type_check"

有没有办法让 Hibernate 根据修改后的枚举值自动更新 check 约束?如果没有,使用 Hibernate 和 Spring Boot 处理数据库中此类枚举更改的推荐方法是什么?

我探索了使用删除和重新创建表,更新 check 约束以包含新的枚举值。虽然我最初希望 Hibernate 能够自动处理此类更新。ALTER TABLE

java postgresql spring-boot 休眠 枚举

评论


答: 暂无答案