1

enum有没有办法为从数据模型生成 DDL 时定义的字段生成域?

定义为的字段的默认行为enumEnumType.STRINGEnumType.ORDINAL。在这种特殊情况下,我使用@Enumerated(EnumType.STRING).

我的枚举.java

public enum MyEnum {
   MY_VALUE_1, MY_VALUE_2, MY_VALUE_3
}

我的实体.java

@javax.persistence.Entity
public class MyEntity {
   @javax.persistence.Id
   private long id;

   @javax.persistence.Enumerated(javax.persistence.EnumType.STRING)
   private MyEnum status;
}

不幸的是,这被定义为“仅” character varying(255)(我使用的是 PostgreSQL RDBMS)。

ALTER TABLE myentity ADD COLUMN status character varying(255);

这当然提供了将与实际无关的垃圾放在那里的机会enum

INSERT INTO myentity(id, status) VALUES (1, 'THIS_HAS_NOTHING_TO_DO_WITH_THE_ENUM');

在这个地方,我希望能够提示 Hibernate 生成一个域,其中只包含那些实际属于枚举的允许值。

作为一种解决方法,我想使用@Check注释生成检查约束。然而令人遗憾的是,这不能动态地完成。我想循环遍历MyEnum.values()以生成此检查,这样我就不必在枚举获取附加值时同时更改它。

public class MyEntity {
   @javax.persistence.Id
   private long id;

   @javax.persistence.Enumerated(javax.persistence.EnumType.STRING)
   @org.hibernate.annotations.Check(constraints = String.format("currentclub in %s", PlayerStatus.values()))
   private MyEnum status;
}

这当然会导致语法错误

注释属性 Check.constraints 的值必须是常量表达式。

这对我来说很清楚,因为属性值必须在编译时确定。

有没有其他方法可以巧妙地做到这一点?

4

0 回答 0