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