Hibernate 4中的nullSafeGet

时间:2014-02-17 10:04:04

标签: java hibernate

我正在将Hibernate 3升级到Hibernate 4.1。运行应用程序时,我得到以下异常:

java.lang.AbstractMethodError
        at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:124)
        at org.hibernate.type.AbstractType.hydrate(AbstractType.java:106)
        at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2701)
        at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1541)
        at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1473)
        at org.hibernate.loader.Loader.getRow(Loader.java:1373)
        at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:640)
        at org.hibernate.loader.Loader.doQuery(Loader.java:850)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
        at org.hibernate.loader.Loader.loadEntity(Loader.java:2042)
        at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:82)
        at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:72)
        at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3710)
        at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:439)
        at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:420)
        at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:204)
        at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:251)
        at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:148)
        at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:992)
        at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:919)
        at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:610)
        at org.hibernate.type.EntityType.resolve(EntityType.java:438)
        at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:150)
        at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:995)
        at org.hibernate.loader.Loader.doQuery(Loader.java:874)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
        at org.hibernate.loader.Loader.doList(Loader.java:2447)
        at org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2292)
        at org.hibernate.loader.Loader.list(Loader.java:2255)
        at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470)
        at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)
        at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:196)
        at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1161)
        at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
        at my.com.MyDAOImpl.findDocuments(MyDaoImpl.java:22)......

我了解Hibernate4更改了nullSafeGet()nullSafeSet()中的参数。因此,我必须使用新参数覆盖这些方法,并在自定义类型实现中忽略SessionImplementor。

findDocuments()基本上是从Documents表中查询文档,Document.hmb.xml的所有字段都没有自定义类型。我的难题是为什么要调用CustomType.nullSafeGet()?在Document.hmb.xml中,只有一个嫌疑人,但我不确定此刻,因为我将类型更改为“Blob”并得到相同的错误。

  <property name="image" column="PICTURE" type="org.springframework.orm.hibernate3.support.BlobByteArrayType"/>
你能帮帮忙吗?

1 个答案:

答案 0 :(得分:0)

我的问题已通过将“org.springframework.orm.hibernate3.support.BlobByteArrayType更改为”materialized_blob来解决。

<property name="image" column="PICTURE" type="materialized_blob"/>

看起来Spring实现调用Hibernate 3 CustomType.javaHibernate 4 CustomType.java冲突。有一节经验教训,当将Hibernate 3升级到4时,blob列需要使用“materialized_blob”作为类型,这比Hibernate 3简单得多,Spring必须将lobHandler置于sessionFactory中。