我正在尝试使用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
,但我不知道该把它放在哪里。
答案 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;
}
应该初始化证书,以便即使在会话关闭后也可以访问它们。
但是:请记住,明确管理会话和交易可能不是最好的方法。