Java Hibernate:getter返回类型导致的ClassCastException(仅在CI的单元测试中)
我有一个hibernate实体,它包含一个enum MyEnum。此枚举保存为字符串,这是枚举的名称。我们同意这是错误的,因为枚举的名称可能会更改 为了简化此枚举的使用,getter返回MyEnum而不是String。代码如下:Java Hibernate:getter返回类型导致的ClassCastException(仅在CI的单元测试中),java,hibernate,unit-testing,enums,Java,Hibernate,Unit Testing,Enums,我有一个hibernate实体,它包含一个enum MyEnum。此枚举保存为字符串,这是枚举的名称。我们同意这是错误的,因为枚举的名称可能会更改 为了简化此枚举的使用,getter返回MyEnum而不是String。代码如下: public class MyEntity{ private String enumField; public MyEnum getEnumField(){ return MyEnum.valueOf(enumField); } } 我们使用
public class MyEntity{
private String enumField;
public MyEnum getEnumField(){
return MyEnum.valueOf(enumField);
}
}
我们使用hibernate core 3.3.2.GA
这在我们的单元测试中运行良好。但是,在我们的持续集成TeamCity上运行时,在读取实体时失败:
java.lang.ClassCastException: com.inetpsa.cob.outils.bean.EnumSurveillance cannot be cast to java.lang.String
at org.hibernate.type.StringType.toString(StringType.java:67)
at org.hibernate.type.NullableType.toLoggableString(NullableType.java:239)
at org.hibernate.pretty.Printer.toString(Printer.java:76)
at org.hibernate.pretty.Printer.toString(Printer.java:113)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:120)
at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:58)
at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:997)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1142)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:930)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:921)
at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:913)
我不明白为什么在当地和TeamCity的行为会有所不同
感谢您的帮助:为什么本地和团队城市之间存在差异? ->本地hibernate调试已禁用,而在Team City上已启用 问题来自hibernate在调试模式下完成的漂亮打印 要获取属性enumField,它使用字段的getter,正如我们在类AbstractEntityTuplizer中看到的:
public Object[] getPropertyValues(Object entity) throws HibernateException {
boolean getAll = shouldGetAllProperties( entity );
final int span = entityMetamodel.getPropertySpan();
final Object[] result = new Object[span];
for ( int j = 0; j < span; j++ ) {
StandardProperty property = entityMetamodel.getProperties()[j];
if ( getAll || !property.isLazy() ) {
result[j] = getters[j].get( entity );
}
else {
result[j] = LazyPropertyInitializer.UNFETCHED_PROPERTY;
}
}
return result;
}
由于该值是通过getter检索的,因此会抛出ClassCastException
public String toString(Object value) {
return (String) value;
}