Hibernate OneToMany Lazy Fetching

时间:2015-03-23 02:40:37

标签: java hibernate jpa

我正在尝试使用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,但我不知道该把它放在哪里。

1 个答案:

答案 0 :(得分:1)

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

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

的内容
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;
    }

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

但是:请记住,明确管理会话和交易可能不是最好的方法。