enum
有没有办法为从数据模型生成 DDL 时定义的字段生成域?
定义为的字段的默认行为enum
是EnumType.STRING
或EnumType.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 的值必须是常量表达式。
这对我来说很清楚,因为属性值必须在编译时确定。
有没有其他方法可以巧妙地做到这一点?