java - 懒加载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:这是一段伪代码,交易是在这个方法之外处理的,我只报告了一些代码来显示问题:)
解决方案
如果您不想在第一种方法中出现错误,则可以使用以下方法:
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
推荐阅读
- reactjs - 如何将 React 应用程序部署到全球网络?
- home-automation - 有没有办法使用jsonpath从这个rest api中具体引用一个id?
- python - tkinter 画布大小和导航工具栏问题
- android - 如何在 Kotlin 中为我的应用创建视频背景?setVideoURI 和 setVideoPath 不起作用
- swashbuckle - 如何在 Swashbuckle 中抑制代码参数
- http - 与 HTTP 的持久(基于推送)通信
- java - JsonPath 在 Spring Cloud Data Flow 过滤器组件中无法正常工作
- highcharts - Highcharts 导出服务器布局算法错误
- java - Java 8 JVM 堆大小不断缩小
- dns - 来自需要主机标头的 AKS 后端的 Azure FrontDoor 的 503 响应