SSH整合——Hibernate延迟加载引发的问题

来源:互联网 发布:ftp传输数据的具体方式 编辑:程序博客网 时间:2024/06/05 12:40

BUG描述:
bug1:
这里写图片描述
如图,所属部门没有显示,所属部门是一个实体类,员工也是一个实体类,其中一个属性就是部门。这里之所以没有显示就是因为Hibernate延迟加载引发的。
延迟加载介绍:(http://blog.csdn.net/xiaoyu714543065/article/details/8213027)

这里就是因为一开始加载Employee集合的时候,因为department属性未被使用,所以采用了延迟加载。当在jsp页面遍历Employee集合的时候,此时就用到了department属性,但是因为这里采用的是getHibernateTemplate(),session是由Spring注入管理的。而此时session已经被Spring关闭,所以无法加载显示。
解决方法1:配置hibernate时配置成不采用延迟加载lazy=“false”
解决方法二:添加如下代码

<filter>    <filter-name>OpenSessionInViewFilter</filter-name>                               <filterclass>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter<   /filter-class>  </filter>   <filter-mapping>    <filter-name>OpenSessionInViewFilter</filter-name>    <url-pattern>*.action</url-pattern>  </filter-mapping>

该filter会将session绑定至当前请求的线程上,这样只要是在当前请求的生命周期内,可以随时访问session。
添加完成后,可以正常显示。
接着进行增加新员工信息的时候报错:
bug2:
这里写图片描述
原因当前是只读模式,无法进行写操作,因为我进行的是增加新用户操作,所以使用了保存操作.
两种方法:
1,web.xml中注册filter时,增加初始化参数(init-param,灵活性不高),进行修改
2,使用声明式事务代理(灵活性很高,推荐)
此处为使用方便,采取第一种:`

    <init-param>       <param-name>flushMode </param-name>       <param-value>AUTO</param-value>    </init-param> 

结果还是同样的错误。再次百度,原来OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flush mode 设为FlushMode.NEVER。故进行insert、 update和delete操作时会产生异常。因此需要采用spring的事务声明,使方法受transaction控制

对employee的service类添加事物管理后,添加正常

spring3.* + hibernate3.* 整合常见问题总结

Spring对Hibernate session的管理

Hibernate延迟加载与opensessioninviewFilter

OpenSessionInViewFilter 的配置及作用

后来再次实验添加的时候报错
bug3:
这里写图片描述

指我的employee引用了一个瞬时对象,请先保存该对象在进行操作。
这里写图片描述
经过排查,发现原来是我的部门没有选择,而且在jsp遍历的时候

        <tr>            <td>所属部门:</td>            <td><s:select name="department.did" list="list" listKey="did" listValue="dname" headerKey="" headerValue="---请选择---"/>            <td>编号:</td>            <td><s:textfield name="eno" /></td>        </tr>

headKey是指缺省值。我设置为空了,这样employee里的department属性相当于均为null,这样好像是不被允许的,原因暂时不清楚。只要给它一个默认值就好了。

struts2中标签的使用

0 0
原创粉丝点击