我正在尝试将grails-project转换为playframework。在Grails中,您可以定义一个id,这样id就会存储在数据库中(请参阅release notes中增强的枚举支持)。我看到了一个similar question,但没有可接受的解决方案。如果我更改类型,CRUD-module就会出现问题,因为应该显示Enum的信息丢失了。
所以我想知道是否有一个很好的基于Hibernate的play解决方案。也许是因为黑客入侵了JPAPlugin?
更新1我开始尝试使用@type-annotation的第二个解决方案。不幸的是,这在hibernate 3.6 (由play 1.2.2使用)中被打破了。TypeFactory.basic()不再是available了。但是根据文档,我找不到合适的解决方案。
更新2有一个针对hibernate 3.6.1的solution,但是在每次使用枚举时定义类型都很笨拙。
@Type(type="hibernatehelper.GenericEnumUserType",
parameters= {
@Parameter(
name = "enumClass",
value = "models.Geschlecht"),
})
public Geschlecht geschlecht = Geschlecht.WEIBLICH; 发布于 2011-07-21 23:51:30
不确定它是否真的有效,但一种可能的解决方案可能是:
org.hibernate.type.AbstractSingleColumnStandardBasicType;hibernatehelper;导入java.io.Serializable;导入java.lang.reflect.Method;导入java.sql.PreparedStatement;导入java.sql.ResultSet;导入java.sql.SQLException;导入java.util.Properties;导入org.hibernate.HibernateException;导入hibernatehelper;导入org.hibernate.usertype.ParameterizedType;导入org.hibernate.usertype.UserType;公有类GenericEnumUserType implements,ParameterizedType {私有类identifierType;私有方法identifierMethod;私有方法valueOfMethod;私有静态最终字符串defaultIdentifierMethodName = "getId";私有静态最终字符串defaultValueOfMethodName = "parseId";私有AbstractSingleColumnStandardBasicType类型;私有int[] sqlTypes;@Override public void setParameterValues(属性参数){ String enumClassName = parameters.getProperty(" enumClass ");try {enumClass=parameters.getProperty} catch (ClassNotFoundException异常){抛出新的HibernateException(“未找到枚举类”,异常);} String identifierMethodName = parameters.getProperty(" identifierMethod ",defaultIdentifierMethodName);try {identifierMethod= enumClass.getMethod(identifierMethodName,新类);identifierType = identifierMethod.getReturnType();} catch (异常异常){抛出新类型(“操作标识符方法失败”,异常);} TypeResolver tr =新TypeResolver();HibernateException= (AbstractSingleColumnStandardBasicType) tr.basic(identifierType .getName());if (类型为== null) {抛出新的HibernateException(“不支持的标识符类型”+ identifierType.getName());} sqlTypes =新的int[] {type.sqlType()};String valueOfMethodName = parameters.getProperty("valueOfMethod",defaultValueOfMethodName);尝试{ valueOfMethod = enumClass.getMethod(valueOfMethodName,新方法{identifierType});} catch (异常异常){抛出新HibernateException(“操作valueOf方法失败”,异常);}}@重写公共类returnedClass() {返回enumClass;} catch (异常异常){抛出新的HibernateException(“调用枚举类的valueOfMethod时发生异常:",异常);}}公共无效nullSafeSet(PreparedStatement st,对象值,整型索引)抛出HibernateException,SQLException {SQLException{对象标识符=值!= null?IdentifierMethod.invoke(值,新对象):null;st.setObject(索引,标识符);} catch (异常异常){抛出新的HibernateException(“调用枚举类的identifierMethod时出现异常:",异常);}}
Enum的每个属性,并检查此类型是否具有静态方法parseId。而不是add the following annotation with javaassist:@Type(type="hibernatehelper.GenericEnumUserType",参数{@ parameters= ( name = "enumClass",value = ""),})
但我不确定对于这样的问题,这是不是太神奇了。也许有人能给我一个建议。
https://stackoverflow.com/questions/6774517
复制相似问题