我收到以下异常:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
以下是事实:
我尝试解决该问题,程序完成。我看不到任何异常。有时该行成功,有时会导致上述异常。即使在例外之后,其他迭代也会成功。
当我执行以下名为getState的简单bean时,就会发生错误:
private String state = "";
@Column(name = "state")
public String getState() {
if (state == null)
return "";
return this.state;
}
此文件的顶部类似于以下内容:
@Entity
@Table(name = "address")
public class Address implements java.io.Serializable {
如果我关闭了会话然后尝试访问惰性数据,我会理解出现此错误。我什至可以想象在某些情况下与交易有关的错误。但是当我只阅读而不关闭会话时,我无法理解这一点。
非常感谢您的帮助!
布雷克·麦克布莱德
答案 0 :(得分:0)
在遇到此问题的情况下,我为每个实体使用了一些代码。
public static <T> T stripHibernateProxy(EntityManager em, T obj) {
if (obj instanceof HibernateProxy) {
HibernateProxy proxy = (HibernateProxy) obj;
LazyInitializer li = proxy.getHibernateLazyInitializer();
if (li.isUninitialized()) {
if (li.getSession() == null) {
li.setSession((SharedSessionContractImplementor) em);
}
li.initialize();
}
obj = (T) li.getImplementation((SharedSessionContractImplementor) em);
}
return obj;
}
我已经编辑了一些部分,因为这不是它获取EntityManager的方式,但是,每当我遇到这些错误时,这都会使我免于所有那些延迟加载的会话错误。
此代码适用于Hibernate 5.2,在旧版本中,类型转换所需的某些接口不同,但是方法名称相同。
答案 1 :(得分:0)
进行批量迭代(可能用于报告或导出)时,必须定期执行session.clear(),否则Hibernate会将所有记录保留在内存中,并且可能会耗尽内存。 session.clear()使Hibernate忘记所有先前的记录。但是,如果您尝试在session.clear()之后 访问延迟加载的数据,则会遇到上述错误。确保所有延迟加载的数据在clear()之前 加载,然后在clear()之后可以访问该数据。这可以通过简单地对数据调用getter而不执行任何操作来完成。访问懒惰的记录是不够的。您必须访问它的数据元素。