会话仍打开时没有会话错误

时间:2018-07-31 20:42:24

标签: hibernate

我收到以下异常:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

以下是事实:

  • 休眠5.1.0
  • 我的程序只读取-没有更新或插入
  • 直到整个程序完成,会话才会关闭
  • 我正在做很多延迟加载(我有250多个表)

我尝试解决该问题,程序完成。我看不到任何异常。有时该行成功,有时会导致上述异常。即使在例外之后,其他迭代也会成功。

当我执行以下名为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 {

如果我关闭了会话然后尝试访问惰性数据,我会理解出现此错误。我什至可以想象在某些情况下与交易有关的错误。但是当我只阅读而不关闭会话时,我无法理解这一点。

非常感谢您的帮助!

布雷克·麦克布莱德

2 个答案:

答案 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而不执行任何操作来完成。访问懒惰的记录是不够的。您必须访问它的数据元素。