【问题标题】:Hibernate Lazy Initialization Exception for loading lazy list加载惰性列表的 Hibernate 惰性初始化异常
【发布时间】:2020-10-10 15:40:26
【问题描述】:

我有这两个实体

@Entity
@Table(name = "CallSession")
public class CallSession implements Serializable {

    private long id;
    private List<CallParticipant> members;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }    

    @OneToMany(mappedBy = "callSession", fetch = FetchType.LAZY)
    public List<CallParticipant> getMembers() {
        return members;
    }

    public void setMembers(List<CallParticipant> members) {
        this.members = members;
    }    
}    


@Entity
@Table(name = "CallParticipant")
public class CallParticipant implements Serializable {    

    private long id;
    private CallSession callSession;    

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @ManyToOne
    public CallSession getCallSession() {
        return callSession;
    }

    public void setCallSession(CallSession callSession) {
        this.callSession = callSession;
    }    
}

但是当我调用callSession.getMembers() 方法时, 我得到这个例外:

无法评估表达式 Method throw 'org.hibernate.LazyInitializationException' 异常。

我不知道为什么会出现此错误?为什么会出现此错误,我该如何解决?

【问题讨论】:

    标签: java hibernate jpa jpql hibernate-mapping


    【解决方案1】:

    我将首先假设您希望您的收藏是延迟加载的。

    Hibernate 的 session 可以在很多情况下关闭,一旦 session 关闭,它将无法获取任何延迟加载的集合。

    通常,Hibernate 非常擅长在 Web 应用程序上下文中为 HTTP 线程的生命周期保持会话打开(Spring 的“视图中的打开会话”)。会话可能关闭的原因包括对象从一个线程移交给另一个线程,或者对象被缓存然后被另一个线程访问。

    但如果您的代码在作业或非 Web 应用程序上下文中运行,则可能会更加困难。

    修复

    1.创建一个存储库方法以显式获取集合

    使用@Queryjoin fetch,添加一个明确预先加载集合的存储库方法。

    2。获取对象后在集合上调用 .toString()。

    这是我以前见过很多人在现实世界中使用的令人讨厌的 hack。基本上,在缓存对象或将其交给执行程序或其他线程可以访问它的地方之前,请在集合上调用 .toString() 以加载它。通常留下评论解释原因。

    3.将@Transactional 添加到一个既要获取数据又要访问集合的方法中

    除了让会话保持活动状态(例如,数据库操作同时成功和失败)之外,这还有很多含义,但可以作为一种快速修复方法来保持会话活动,例如在作业方法中。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多