【发布时间】:2015-06-18 21:48:01
【问题描述】:
我已经按照older topic on stackoverflow 中的建议实现了 equals()/hashCode() 方法。这种方法的问题是例外
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:160) [hibernate-core-4.1.6.Final.jar:4.1.6.Final]
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:259) [hibernate-core-4.1.6.Final.jar:4.1.6.Final]
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185) [hibernate-core-4.1.6.Final.jar:4.1.6.Final]
at pkg.db.TblChain_$$_javassist_815.equals(TblChain_$$_javassist_815.java) [classes:]
[...]
在调用 equals() 之前抛出。它只发生在实体具有例如其他实体的外键。由于会话关闭(equals() 在新的 JSF 请求中调用,EntityManager 是请求范围的),Hibernate 尝试获取这些实体并触发异常。
解决方案的人从来没有遇到过这个问题,这就是我向你寻求帮助的原因。
编辑 14.04.2015 14:50: equals() 都是使用实体的 ID 实现的。但是对于这个例子,我已经用一个简单的 return 替换了它的实现,因为这并不重要。我发现在外部实体 (tblChain) 中是否有另一个外部实体(例如 tblChainType)并不重要。如果在用于加载的实体管理器处于活动状态时未使用第一个,它将始终失败。
// Entity classes
public class TblChainInstance {
private TblChain tblChain; // Foreign entity
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "intChainId", nullable = false)
public TblChain getTblChain() {
return this.tblChain;
}
public boolean equals(Object other) {
return false; // doesn't matter, what I have here.
// It always works if this is the selected Entity.
}
}
public class TblChain {
public boolean equals(Object other) {
return false; // doesn't matter, what I have here.
// It always throws a LazyInitializationException
}
}
// Testcode
@Named @ViewScoped
public class MyBean implements Serializable {
private TblChainInstance _tblChainInstance;
@PostConstruct
public void _init() {
_tblChainInstance = new JPAQuery(_entityManager).from(qtChainInstance)
.limit(1).singleResult(qtChainInstance);
}
public void actionListener() {
System.out.println(_tblChainInstance.equals(1)); // outputs false
System.out.println(_tblChainInstance.getTblChain().equals(1)); // throws
}
}
【问题讨论】: