我尝试使用在WildFly10上运行Hibernate的postgres自定义枚举(也使用WildFly9进行测试,结果相同)。 在搜索过程中,我找到了几个点上提到的解决方案,例如
所以基本上我添加了一个自定义UserType并添加了一个指向特定java类型/转换器的@Type注释。它可以工作,我可以在JEE应用程序中使用它,也可以在JSE应用程序中使用它没有任何问题。
如果我启用验证
<property name="hibernate.hbm2ddl.auto" value="validate"/>
我收到以下错误
Schema-validation: wrong column type encountered
in column [gender] in table [test];
found [gender_type (Types#VARCHAR)], but expecting [uuid (Types#OTHER)]
为什么在gender_type正确的情况下期待UUID?
PostgreSQL类型:
CREATE TYPE gender_type as ENUM ('MALE','FEMALE');
PostgreSQL表
create table test (
name varchar(200) NOT NULL PRIMARY KEY,
gender gender_type NOT NULL
);
Java enum
public enum GenderEnum {
MALE ("MALE"),
FEMAIL ("FEMALE");
private String value;
private GenderEnum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
Java EnumType
public class GenderEnumType extends GenericEnumType<String, GenderEnum> {
public GenderEnumType() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
super(GenderEnum.class, GenderEnum.values(), "getValue", Types.OTHER);
}
@Override
public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException {
return nullSafeGet(rs, names, owner);
}
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException {
nullSafeSet(st, value, index);
}
}
GenericEnumType基本上是来自http://octagen.at/2014/10/postgresql-custom-data-types-enum-in-hibernate/的那个。
测试实体:不是
@Basic(optional = false)
@Enumerated (EnumType.STRING)
@Type (type = "full.path.to.GenderEnumType")
@Column(name = "gender")
private GenderEnum gender;
,也不
@Basic(optional = false)
@Type (type = "full.path.to.GenderEnumType")
@Column(name = "gender")
private GenderEnum gender;
的工作原理。