2012-10-29 82 views
7

我使用基于hibernate 4和xml的映射。下面是我得到Hibernate EnumType实例化异常

Caused by: org.hibernate.MappingException: Unable to instantiate custom type: org.hibernate.type.EnumType 
    at org.hibernate.type.TypeFactory.custom(TypeFactory.java:193) 
    at org.hibernate.type.TypeFactory.custom(TypeFactory.java:179) 
    at org.hibernate.type.TypeFactory.byClass(TypeFactory.java:103) 
    at org.hibernate.type.TypeResolver.heuristicType(TypeResolver.java:130) 
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:307) 
    at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:294) 
    at org.hibernate.mapping.Property.isValid(Property.java:238) 
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:469) 
    at org.hibernate.mapping.RootClass.validate(RootClass.java:270) 
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1294) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1742) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1788) 
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:189) 
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:350) 
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:335) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$6.run(AbstractAutowireCapableBeanFactory.java:1504) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1502) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) 
    ... 35 more 
Caused by: java.lang.NullPointerException 
    at org.hibernate.type.EnumType.setParameterValues(EnumType.java:153) 
    at org.hibernate.type.TypeFactory.injectParameters(TypeFactory.java:131) 
    at org.hibernate.type.TypeFactory.custom(TypeFactory.java:189) 
    ... 53 more 

而且这里的例外是,我使用

<property name="coachingStatus" column="status" update="true" insert="true" index="true"> 
     <type name="org.hibernate.type.EnumType"> 
     <param name="enumClass">com.tutorial.enums.CoachingStatus</param> 
     <param name="type">12</param> 
     </type> 
    </property> 

这里枚举映射的枚举:

public enum CoachingStatus { 
    ACTIVE, BLOCKED, PENDING, EXPIRED 
} 

这里是实体

public class Coaching implements Serializable { 
    private Integer id; 
    private String name; 
    private Long locationId; 
    private Integer organisationId; 
    private Long ownerId; 
    private Date createdOn; 
    private Date modifiedOn; 
    private CoachingStatus coachingStatus; 
    private Long createdBy; 
    private Long modifiedBy; 
    private String email; 
    private String logo; 
    private String about; 
    private String phone; 
... //getters and setters 
} 

我查看了tutoria我从这里 - here但我越来越错误。需要帮助。

+0

您是否在实体中为此“hbm.xml”文件声明了'CoachingStatus status'变量 –

+0

是的。我将在问题中添加实体。 – Shwetanka

回答

9

我有同样的问题,它看起来像解决方案是添加另一个参数。这样,它不会试图将它作为序号持续存在,而是作为字符串,所以我猜这个字符串在VARCHAR类型下效果更好。

<property name="coachingStatus" column="status" update="true" insert="true" index="true"> 
    <type name="org.hibernate.type.EnumType"> 
     <param name="enumClass">com.tutorial.enums.CoachingStatus</param> 
     <param name="type">12</param> 
     <param name="useNamed">true</param> 
    </type> 
</property> 

通过设置useNamedtrue Hibernate会用它的名字,所以如果你在枚举类型更改为了你的数据不会打破枚举存储。