论坛首页 Java版 Hibernate

『讨论』Hibernate的session应该放在那一层

浏览 2698 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2006-01-11
软件环境:
struts + spring + hiberante
结构为action --> bo --> Service -->Dao

配置文件:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

<!-- 数据源-->
<bean id="jndidataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<!-- "jdbc/example"为tomcat的JNDI数据源名-->
<value>java:comp/env/jdbc/oa</value>
</property>
</bean>
<!-- bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
<value>net.sourceforge.jtds.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=cwoa</value>
<value>jdbc:jtds:sqlserver://127.0.0.1:1433/model</value>
</property>
<property name="username">
<value>sa</value>
</property>
<property name="password">
<value>sa</value>
</property>
</bean-->

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<!-- 数据源名 -->
<ref local="jndidataSource" />
</property>
<property name="mappingResources">
<list>
   <!-- value>com/ippbx/voip/pojo/hibernate/xml/Tlog.hbm.xml</value>
   <value>com/ippbx/voip/pojo/hibernate/xml/Customer.hbm.xml</value>
   <value>com/ippbx/voip/pojo/hibernate/xml/Agent.hbm.xml</value-->
   <value>com/cuangwu/base/util/pojo/TShunxu.hbm.xml</value>
     
   <value>com/cuangwu/oa/pojo/xml/SysYongHu.hbm.xml</value>
   <value>com/cuangwu/oa/pojo/xml/SysYhyzguanLian.hbm.xml</value>
   <value>com/cuangwu/oa/pojo/xml/SysYongHuZu.hbm.xml</value>
   <value>com/cuangwu/oa/pojo/xml/SysWenJianGl.hbm.xml</value>
   <value>com/cuangwu/oa/pojo/xml/Syslog.hbm.xml</value>
     
   <value>com/cuangwu/oa/pojo/xml/SysMBLiuChen.hbm.xml</value>
   <value>com/cuangwu/oa/pojo/xml/SysMbhuanJie.hbm.xml</value>   
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>

<!-- Spring的数据访问异常转换器(Data Access Exception Translator)定义 -->
<bean id="jdbcExceptionTranslator" class="org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator">
<property name="dataSource">
<ref bean="jndidataSource" />
</property>
</bean>

<!-- Hibernate Template定义 -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
<property name="jdbcExceptionTranslator">
<ref bean="jdbcExceptionTranslator" />
</property>
</bean>

<!--事务基类: transactionProxy -->
<bean  id="transactionProxy" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="proxyTargetClass">
<value>true</value>
</property>
<property name="transactionAttributes">
<props>

<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop> <!--缺失了此属性会报错-->
<prop key="del*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>

<!-- 业务表游水号 -->
<bean id="shunxuDao" class="com.cuangwu.base.util.shunxu.implement.ShuXuDaoImp">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>

<bean id="shunxuTarget" class="com.cuangwu.base.util.shunxu.implement.ShunxuSvrImpl">
<property name="IDao">
<ref local="shunxuDao" />
</property>
</bean>

<bean id="shunxuManager" parent="transactionProxy">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="shunxuTarget" />
</property>
</bean>

<!-- 业务相关设置 -->
<!-- hibernate实现, Dao必须继承HibernateDaoSupport -->
<!-- 日志 -->
<bean id="logDao" class="com.cuangwu.oa.log.implement.LogDaoimpl">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>

<bean id="logTarget" class="com.cuangwu.oa.log.implement.LogSvrimpl">
<property name="IDao">
<ref local="logDao" />
</property>
</bean>

<bean id="logManager" parent="transactionProxy">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="logTarget" />
</property>
</bean>

<!-- 用户 -->
<bean id="yonghuDao" class="com.cuangwu.oa.yonghu.implement.YonghuDaoimpl">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>

<bean id="yonghuTarget" class="com.cuangwu.oa.yonghu.implement.YonghuSvrimpl">
<property name="IDao">
<ref local="yonghuDao" />
</property>
</bean>

<bean id="yonghuManager" parent="transactionProxy">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="yonghuTarget" />
</property>
</bean>


<!-- 用户组 -->
<bean id="yonghuzuDao" class="com.cuangwu.oa.yonghu.implement.YonghuzuDaoimpl">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>

<bean id="yonghuzuTarget" class="com.cuangwu.oa.yonghu.implement.YonghuzuSvrimpl">
<property name="IDao">
<ref local="yonghuzuDao" />
</property>
</bean>

<bean id="yonghuzuManager" parent="transactionProxy">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="yonghuzuTarget" />
</property>
</bean>

<!-- 文件管理 wenjiangl -->
<bean id="wenjianglDao" class="com.cuangwu.oa.wenjiangl.implement.WenjianglDaoimpl">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>

<bean id="wenjianglTarget" class="com.cuangwu.oa.wenjiangl.implement.WenjianglSvrimpl">
<property name="IDao">
<ref local="wenjianglDao" />
</property>
</bean>

<bean id="wenjianglManager" parent="transactionProxy">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="wenjianglTarget" />
</property>
</bean>

<!-- 流程模板 mbliuchen -->
<bean id="mbliuchenDao" class="com.cuangwu.oa.liuchen.implement.MbLiuchenDaoimpl">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>

<bean id="mbliuchenTarget" class="com.cuangwu.oa.liuchen.implement.MbLiuchenSvrimpl">
<property name="IDao">
<ref local="mbliuchenDao" />
</property>
</bean>

<bean id="mbliuchenManager" parent="transactionProxy">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="mbliuchenTarget" />
</property>
</bean>
</beans>
错误提示信息:
failed to lazily initialize a collection of role: com.cuangwu.oa.pojo.SysYongHu.sysYhyzguanLians - no session or session was closed
你的分析:
我现在是把hibernate的session放在Dao层.
session通过Dao.openSession()方法获得
    protected Session openSession() {
        return SessionFactoryUtils.getSession(getSessionFactory(), false);
        //return getSession();
    }

其中,YongHu表与YongHuzu是多对一关系.lazily定义为true(不想用false)
当在Bo层调用Service.load(1)得到了YongHu对象.但接下来要通过YongHu获取YongHuzu就报错session was closed了.
   
最后更新时间:2006-01-12
这不很明显,session已经close掉了你再去取lazy的东东。你的session是在哪关的?事物处理是在bo还是sevice?

小弟不才,能问下为什么要分这么一层么
bo --> Service 谢谢
   
0 请登录后投票
最后更新时间:2006-01-12
KayMO 写道
这不很明显,session已经close掉了你再去取lazy的东东。你的session是在哪关的?事物处理是在bo还是sevice?

小弟不才,能问下为什么要分这么一层么
bo --> Service 谢谢 :D
在DAO的每个操作数据库的方法中,只用openSession()获取Session,没有关闭它操作的.

小弟不才,能问下为什么要分这么一层么 bo --> Service
bo是完全的业务类,只调用service. service只是事务处理功能.
   
0 请登录后投票
最后更新时间:2006-01-12
Session难道没关?这样很容易引起连接混乱。至少我就被折磨过。

为什么不直接把事务弄到你的bo里面呢?根据业务操作来操控session的关闭,我想应该能解决你的问题,好象还省了serivce层
   
0 请登录后投票
最后更新时间:2006-01-12
KayMO 写道
Session难道没关?这样很容易引起连接混乱。至少我就被折磨过。

为什么不直接把事务弄到你的bo里面呢?根据业务操作来操控session的关闭,我想应该能解决你的问题,好象还省了serivce层 :arrow:
如果在serivce操作session,Dao的每个方法都要接收调用方传来的session吗?
   
0 请登录后投票
最后更新时间:2006-01-12
dao是dao,事务是事务,具体操作请搜索以前帖
   
0 请登录后投票
最后更新时间:2006-02-03
我zm就觉得。。。 service 与 bo的位置 应该调换。。。。因为通常 讲的service中的事务不是 db tx 而是 bizlogic tx 而 db tx应该在 dao所在的 layer 覆盖掉
   
0 请登录后投票
论坛首页 Java版 Hibernate

跳转论坛:
JavaEye推荐