[英]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.