【发布时间】:2016-10-12 03:49:42
【问题描述】:
HIbernate JPA与javassist.util.proxy.Proxy不兼容造成的。
代码
public class EntityA {
@Id
private String id;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "entityB_id")
private EntityB entityB;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "entityC_id")
private EntityC entityC;
}
String sql = "select o from EntityA o "
+ "left outer join o.entityB as o1 ";
final TypedQuery<EntityA> query = getEm().createQuery(sql, EntityA.class);
final List<EntityA> result = query.getResultList();
问题
当在上面运行时查询会低于异常,有人知道吗?
我的查询没有涉及“EntityC”,为什么在 getResultList() 方法中会抛出关于 EntityC 的异常?
例外
Caused by: java.lang.ClassCastException: xxx.xx.xx.EntityC_$$_javassist_105 incompatible with javassist.util.proxy.Proxy
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.getProxy(JavassistLazyInitializer.java:148)
at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.getProxy(JavassistProxyFactory.java:73)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:758)
at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:4419)
at org.hibernate.event.internal.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:334)
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:260)
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:152)
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1053)
at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:980)
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:714)
at org.hibernate.type.EntityType.resolve(EntityType.java:502)
at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:168)
at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:137)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1112)
at org.hibernate.loader.Loader.processResultSet(Loader.java:969)
at org.hibernate.loader.Loader.doQuery(Loader.java:917)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:348)
at org.hibernate.loader.Loader.doList(Loader.java:2550)
at org.hibernate.loader.Loader.doList(Loader.java:2536)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2366)
at org.hibernate.loader.Loader.list(Loader.java:2361)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:495)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:357)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:198)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1230)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:268)
at sun.reflect.GeneratedMethodAccessor213.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56)
at java.lang.reflect.Method.invoke(Method.java:620)
at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:368)
at com.sun.proxy.$Proxy153.getResultList(Unknown Source)
at com.cimb.module.payment.bill.ce.dao.CEMYCCPayeeAccessBean.findNormalByPayeeNameKeyword(CEMYCCPayeeAccessBean.java:59)
at com.cimb.module.payment.bill.atom.RetrieveBillerByKeywordMYAtom.performNormalBillerSearch(RetrieveBillerByKeywordMYAtom.java:58)
at com.cimb.module.payment.bill.atom.RetrieveBillerByKeywordMYAtom.proceedNextStep(RetrieveBillerByKeywordMYAtom.java:45)
at core.logic.DefaultLogicProcessor.process(DefaultLogicProcessor.java:78)
... 94 more
【问题讨论】:
-
也许你的类路径上的库有问题。见stackoverflow.com/questions/22481540/…
-
我不认为是图书馆的问题。我看到很多帖子是关于 java.lang.ClassCastException: xxxx cannot be cast to javassist.util.proxy.Proxy, but not this incompatible with javassist.util.proxy.Proxy。似乎这种关联迫使我加入在父实体中声明的所有实体。
-
可能该库有不同的版本,并且可能会根据其版本为
ClassCastException创建另一条消息。但是,您仍然可能面临同样的问题。 -
您确定异常是由
getResultList()调用引起的吗? -
是的,非常确定。它从堆栈跟踪中显示,该行号指向此“final List
result = query.getResultList();”