懒加载hibernate,正确的做法和一些疑惑

Lazy loading hibernate, the correct way and some doubts

我想知道为什么这两种延迟加载方法之间存在一些差异(因为我期望得到相同的结果),这两种方法都使用 lazy=true 和 fetch="select"

接近号 1

Session miasession = HibernateUtil.getSessionFactory().getCurrentSession();

Invoice i = (Invoice) miasession.get(Invoice.class, id);    

//the Subject entity is Many to One relation
model.addAttribute("subject", i.getSubject());

在这种方法中,当我尝试访问 "subject" 时出现错误,错误是 "org.hibernate.LazyInitializationException: could not initialize proxy - no Session"(这是堆栈跟踪 https://pastebin.com/3fdDKCV0

方法数 2

Session miasession = HibernateUtil.getSessionFactory().getCurrentSession();

Invoice i = (Invoice) miasession.get(Invoice.class, id);            

Subject s = (Subject) miasession.get(Subject.class, i.getSubject().getId());

//the Subject entity is Many to One relation
model.addAttribute("subject", s);

这个可行,但我不知道为什么以前的方法不起作用

PS:这是一段伪代码,交易是在这个方法之外处理的,我只报告了一些代码来说明问题:)

如果你不想得到第一种方法的错误,你可以使用这样的东西:

Session miasession = HibernateUtil.getSessionFactory().getCurrentSession();

Invoice i = (Invoice) miasession.get(Invoice.class, id); 

// load the collection before session is closed
model.addAttribute("subject", Hibernate.initialize(i.getSubject()));

另一种解决惰性问题的方法是在 web.xml

中使用 OpenSessionInViewFilter