有没有办法为从数据模型生成DDL时定义为enum
的字段生成域?
定义为enum
的字段的默认行为是EnumType.STRING
或EnumType.ORDINAL
。在这种特殊情况下,我使用@Enumerated(EnumType.STRING)
。
public enum MyEnum {
MY_VALUE_1, MY_VALUE_2, MY_VALUE_3
}
@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的值必须是常量表达式。
这对我来说很清楚,因为必须在编译时确定属性值。
有没有其他方法可以巧妙地做到这一点?