今天被一个懒加载问题困扰了近八个钟头,现在将这些新的总结下,刚开始我使用的是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)是出现是不是报出懒加载的问题。