繁体   English   中英

休眠OneToMany懒惰获取

[英]Hibernate OneToMany Lazy Fetching

我正在尝试使用hibernate进行延迟获取,但是我始终会收到LazyInitializationException ,我知道发生这种情况是因为Hibernate会话已关闭,并且我倾向于在选择或插入数据后的下一次关闭该会话。 这是我的代码:我有一个CV类,其中包含许多Certificates

public class Cv implements java.io.Serializable {
    ...
    @OneToMany(mappedBy = "cv",fetch = FetchType.LAZY)
    private Set<Certificate> certificates = new HashSet<>(0);
    ...
    public static List<Cv> getAllCvs() {
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            List<Cv> list;

            list = session.createCriteria(Cv.class).addOrder(Order.asc("id")).list();

            if (session.isOpen()) {
                session.close();
            }

            return list;
        } catch (Exception e) {
            if (session.isOpen()) {
                session.close();
            }
            return null;
        }
    }
}



public class Certificate implements java.io.Serializable {
    ...
    @ManyToOne(fetch = FetchType.EAGER)
    private Cv cv;
    ...
}

我读过我可以使用Hibernate.initialize但我不知道将它放在哪里。

更新:评论中提到的帖子中也回答了此问题(詹姆斯)

我假设您尝试访问证书时收到错误消息。 因此,在关闭会话之前,请尝试类似

try {
        List<Cv> list;

        list = session.createCriteria(Cv.class).addOrder(Order.asc("id")).list();
        for(CV cv: list) {
           Hibernate.initialize(cv.getCertificates());
        } 

        if (session.isOpen()) {
            session.close();
        }

        return list;
    } catch (Exception e) {
        if (session.isOpen()) {
            session.close();
        }
        return null;
    }

它将初始化证书,以便即使在会话关闭后也可以访问它们。

但是:请记住,首先明确地管理会话和事务可能不是最佳方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM