我想知道为什么这两种方法在延迟加载方面存在一些差异('因为我预计会得到相同的结果),两种方法都是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:这是一些伪代码,事务是在这个方法之外处理的,我只报告了一些代码来显示问题:)答案 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