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

首先先上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()方法。


关闭延迟加载一:

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

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


关闭延迟加载二:

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

[原创]关于延迟加载的解决问题_第1张图片

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

你可能感兴趣的:([原创]关于延迟加载的解决问题)