Java Hibernate:getter返回类型导致的ClassCastException(仅在CI的单元测试中)

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); } } 我们使用

我有一个hibernate实体,它包含一个enum MyEnum。此枚举保存为字符串,这是枚举的名称。我们同意这是错误的,因为枚举的名称可能会更改

为了简化此枚举的使用,getter返回MyEnum而不是String。代码如下:

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;
}