如何从数据模型生成DDL时从枚举生成域?

时间:2016-06-21 11:37:47

标签: java enums jpa-2.1 hibernate-5.x sql-domain

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

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

MyEnum.java

public enum MyEnum {
   MY_VALUE_1, MY_VALUE_2, MY_VALUE_3
}

MyEntity.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的值必须是常量表达式。

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

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

0 个答案:

没有答案