我正在将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"/>
你能帮帮忙吗?
答案 0 :(得分:0)
我的问题已通过将“org.springframework.orm.hibernate3.support.BlobByteArrayType
更改为”materialized_blob
来解决。
<property name="image" column="PICTURE" type="materialized_blob"/>
看起来Spring实现调用Hibernate 3 CustomType.java
与Hibernate 4 CustomType.java
冲突。有一节经验教训,当将Hibernate 3升级到4时,blob列需要使用“materialized_blob
”作为类型,这比Hibernate 3简单得多,Spring必须将lobHandler
置于sessionFactory中。