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

时间:2018-06-08 10:34:40

标签: java hibernate lazy-loading

我想知道为什么这两种方法在延迟加载方面存在一些差异('因为我预计会得到相同的结果),两种方法都是lazy = true和fetch =" select& #34;

方法编号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());

在这种方法中,当我尝试访问"主题"并且错误是" org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话" (这是堆栈跟踪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:这是一些伪代码,事务是在这个方法之外处理的,我只报告了一些代码来显示问题:)

1 个答案:

答案 0 :(得分:0)

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

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