首页 > 解决方案 > 懒加载hibernate,正确方法和一些疑惑

问题描述

我想知道为什么这两种延迟加载方法之间存在一些差异(因为我期望得到相同的结果),这两种方法都使用了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());

在这种方法中,当我尝试访问“主题”时出现错误,错误是“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:这是一段伪代码,交易是在这个方法之外处理的,我只报告了一些代码来显示问题:)

标签: javahibernatelazy-loading

解决方案


如果您不想在第一种方法中出现错误,则可以使用以下方法:

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


推荐阅读