关于解决懒加载的问题

  今天被一个懒加载问题困扰了近八个钟头,现在将这些新的总结下,刚开始我使用的是struts2-Json的方式不让,目标列序列化,代码如下:

     

 @JSON(serialize = false)
    public Set<FixedArea> getFixedAreas() {
   return fixedAreas;
 }
      

  但是这种方法在我这并不是太如意,时灵时不灵.对了不要有那个小伙伴去尝试把serialize换成,desrialize=true来代替,效果是一样的.然后我又换成了使用web.xml文件中配置openSessionInViewFilter,虽然这太粗暴,但当时我不甘心就试了试,结果配置后整个项目都访问不了,配置代码如下:

 1         <filter>
 2         <filter-name>
 3                 OpenSessionInViewFilter
 4             </filter-name>
 5         <filter-class>
 6                 org.springframework.orm.hibernate5.support.OpenSessionInViewFilter
 7             </filter-class>
 8     </filter>
 9     <filter-mapping>
10             <filter-name>OpenSessionInViewFilter</filter-name>
11             <url-pattern>/*</url-pattern>
12     </filter-mapping>                        

  最后,无奈还是用了数据表关联,中的迫切加载来解决问题:

  这里就要先聊一聊表与表之间的关系:一对一/多对一;一对多;多对多;

  由于我这里是多对多的表结构,那就说多对多,直接先上代码:

@ManyToMany(mappedBy = "couriers",fetch=FetchType.EAGER)
private Set<FixedArea> fixedAreas = new HashSet<FixedArea>();

  我标红的部分就是起作用的不.对了,我先说一下为甚么没有直接使用fetch方式,因为我在查询的时候是用不到区域的信息的.所以就想使用@Json(serialize=false)来让我不需要的列不去序列化(而且我关联表里还没有数据),这列数据就不会被加载那也就自然而然的解决的懒加载的问题,但事情并不是我想像的那样[email protected](serialize=false)仅仅是让这列数据不被序列化,并不能防止懒加载的问题.解决问题后,我做了实验.只有[email protected](serialize=false)项目会报懒加载的错误。配置fetch=FetchType.EAGER之后项目是不会出懒加载的错了,但由于关联表中并没有数据,所以迫切加载的结果就是空。而在时候@Json(serialize=false)起作用了。在获得的数据中是没用fixedAreas这列的数据。也就是说fetch=FetchType.EAGER他解决的是懒加载而不是让数据不加载,而@Json(serialize=false)的作用就是让数据加载时跳过fixedAreas达到fixedAreas不加载。

最终我的猜想就是:最开始只加了@Json(serialize=false),对象在向前台返回数据是是会加载的,加载后会根据配置的       @Json(serialize=false)来跳过不被序列化的列。由于没有配置fetch=FetchType.EAGER造成了在action是事务已经关闭,这是在去加载自然汇报懒加载的问题。而当我配置过fetch=FetchType.EAGER就会是他直接加载但得到的数据为空,而@Json(serialize=false)的作用是跳过该列所以就完美的完成了既不要无用数据也解决了懒加载的问题。

注:我的猜想只是针对我这台电脑上的jvm来说的,因为别人的电脑就配置了一个@Json(serialize=false)就完美的解决了因为不想得到的数据而引起的懒加载问题,试了好几个,就我的电脑在只配置@Json(serialize=false)是出现是不是报出懒加载的问题。

  

原文地址:https://www.cnblogs.com/lkyang/p/8627692.html

时间: 2024-08-28 20:50:03

关于解决懒加载的问题的相关文章

配置Spring的用于解决懒加载问题的过滤器

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://j

解决懒加载异常

在web.xml配置如下加载器 <!-- 配置spring的用于解决懒加载问题的过滤器 -->   <filter>       <filter-name>OpenSessionInViewFilter</filter-name>       <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>  

Hibernate(九)__OpenSessionInView解决懒加载问题

什么是OpenSessionInView? 在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时session已关闭,所以就会出现异常. 比较典型的是在MVC模式中,我们在M层调用持久层获取数据时(持久层用的是load方法加载数据),当这一调用结束时,session随之关闭,而我们希望在V层使用这些数据,这时才会迫使load加载数据,我们就希望这时的session是open着得,这就是所谓的Open Sessi

在web.xml中添加配置解决hibernate 懒加载异常

在web.xml添加如下,注意:在配置在struts2的拦截器之前 <!-- 配置Spring的用于解决懒加载问题的过滤器 --> <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class&g

Hibernate懒加载异常说明及其解决方法

在集成ssh2三大框架的时候很容易就会造成懒加载异常,通常显示的错误信息是: org.hibernate.LazyInitializationException: could not initialize proxy - no Session 懒加载异常出现的原因: 我们在Action中调用Service中的方法,方法中开始时open session,当调用结束后close session,例如类User中有一个Department属性,我们使用Hibernate查询一个User时,hibern

懒加载异常的解决

<filter> <!-- 平时使用懒加载时,有可能会因为hibernate的session(或着jpa的EntityManager)在事务结束时的关闭,导致页面调用数据时,出现懒加载异常 可以这样配置解决懒加载异常,让session在页面上也能使用, 但会使session打开的时间稍微长一点,并发量大时会使性能有所下降,但一般的项目没问题 --> <filter-name>OpenSessionInViewFilter</filter-name> <

SSH中懒加载异常的解决办法

web.xml 的配置文件 <!-- 配置Spring解决懒加载问题的过滤器 --> <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <

过滤器解决hibernate中懒加载问题

使用过滤器解决懒加载问题需要我们对过滤器的生命周期有深刻的理解 1.浏览器发送一个请求 2.请求通过过滤器执行dofilter之前的代码 3.浏览器通过过滤器到达Servlet(注意我们这里的servlet指的是Servlet和其他组件比如jsp) 4.请求在servlet中得到处理,并且得到展示(将数据发到jsp中) 5.依次从后往前执行过滤器中的dofilter之后的代码. 6.将数据返回到用户的浏览器上 我们可以通过在过滤器中拿到Session在jsp页面获得数据之后关闭Session 即

hibernate的懒加载问题

产生原因: 当使用hibernate查询一个对象的时候,如果Session关闭,再调用该对象关联的集合或者对象的时候,会产生懒加载异常! 解决方案: 方案一: 在Session关闭之前,查询对象关联的集合或者对象,所有在业务层的方法上添加: 1 public ElecUser findUserByLogonName(String name) { 2 3 String condition = " and o.logonName = ?"; 4 5 Object [] params = {