[原创]关于延迟加载的解决问题

首先先上BUG

FreeMarker template error (HTML_DEBUG mode; use RETHROW in production!)

Java method "com.itheima.crm.domain.BaseDict_$$_jvst101_2.toString()" threw an exception when invoked on com.itheima.crm.domain.BaseDict_$$_jvst101_2 object [freemarker.core._DelayedJQuote.toString() failed: org.hibernate.LazyInitializationException: could not initialize proxy - no Session]; see cause exception in the Java stack trace.

.........


延迟加载(load)是Hibernate为提高程序执行效率而提供的一种机制,即只有真正使用该对象的数据时才会创建。

延迟加载的过程:通过代理(Proxy)机制来实现延迟加载。Hibernate从数据库获取某一个对象数据时、获取某一个对象的集合属性值时,或获取某一个对象所关联的另一个对象时,由于没有使用该对象的数据(除标识符外),Hibernate并不从数据库加载真正的数据,而只是为该对象创建一个代理对象来代表这个对象,这个对象上的所有属性都为默认值;只有在真正需要使用该对象的数据时才创建这个真正的对象,真正从数据库中加载它的数据。

当调用Session上的load()方法加载一个实体时;当Session加载某个实体时,会对这个实体中的集合属性值采用延迟加载;当Session加载某个实体时,会对这个实体所单端关联的另一个实体对象采用延迟加载


解决延迟加载最简单也是最笨的方法:在加载单个实体时,可以使用get()方法。


关闭延迟加载一:

对于实体中的集合属性,可以在这个集合的(<set>,<list>)添加属性lazy="false"。单端关联另一个实体对象时,可以在映射文件中配置.

添加属性lazy="false"注意:one-to-one不能有constrained=true(产生的sql语句中显示外键),否则懒加载不起作用。


关闭延迟加载二:

在web.xml文件中配置过滤器,用来将session提前到Action中开启

这两种情况可以真正的解决延迟加载问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,906评论 18 399
  • 一、延迟加载简介 当Hibernate从数据库中初始化某个持久态实体时,如果集合属性里包含十几万、甚至百万条记录,...
    不知名的蛋挞阅读 4,876评论 0 1
  • Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加...
    rollAway阅读 3,122评论 0 0
  • 这部分主要是开源Java EE框架方面的内容,包括Hibernate、MyBatis、Spring、Spring ...
    杂货铺老板阅读 5,286评论 0 2
  • 这就是 PersistentSet 集合跟据 owner 属性去抓取特定 Address 记录的 SQL 语句。此...
    FTOLsXD阅读 3,251评论 0 1