簡體   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