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

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值