日期:2014-05-18  浏览次数:20736 次

ssh中hibernate的事务管理怎么获得session
hi
现在是ssh架构 action+service+dao
其中DAO里面是这样:getHibernateTemplate().save来持久化数据的

现在想不改变这些结构加入事务,如果在dao里加我还会,用getHibernateTemplate().getSession()
但是这样是不妥的,一个事务可能有几个dao的几个方法参与,一个dao里的事务不能包涵所有,而且本着OO的思想也应该在service层控制事务
但是service里该怎么获得session呢?刚才的getHibernateTemplate()方法是HibernateDaoSupport里的,service明显不能继承这个类

所以请教大家在service里获得session的方法(当然是要getHibernateTemplate对应的session,而不是另外一个)
或者有什么结构可以解决这个问题,spring的声明式事务就算了,我不太理解。

另外getHibernateTemplate().save这个用法也不能变,否则修改太大了

谢谢

------解决方案--------------------
你在Service()方法中直接request.getSession()
该方法返回与此次请求相关联的Session(当然若是没有它会创建一个新的session)

那可以使用getSession(boolean create)方法,该方法也是返回与此次请求相关的session,
但若是没有分配,而create为true则会创建一个新的session.
若create为false,而此次请求没有一个有效的HttpSession,则返回null

你调用时让create为false即可
------解决方案--------------------
getHibernateTemplate().getSession() 
是不是单里模式如果是在service层中继承这个类或如果为静态方法引入也是可以的 
或者在dao层中加方法transbign()
transend()
commit()
rollback()等你需要在service层中用到的方法
------解决方案--------------------
学习中.........
------解决方案--------------------

 不是都继承了 getsession() 这个函数吗?
------解决方案--------------------

------解决方案--------------------
支持楼上的,我敢打赌1楼的方法肯定不可行
hibernate中的session怎么就能request.getSession() 

------解决方案--------------------
把hibernateTemplate注入到service里,手工为dao注入service的hibernateTemplate,不过似乎没这么干的!(可以不用继承这个类HibernateDaoSupport,直接在你的xxxDAOImpl里加上private HibernateTemplate hibernateTemplate;给他加上setter方法就可以了。 )

不过在不用spring的事务的话,好象只能这么干。

既然都学到这份上了,为什么不学下spring的声明式事务:
很简单。
1.把文件头换下
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

2.加上平台事务实现,你用的hibernate,所以才用HibernateTransactionmanager.
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate" autowire="byName" />
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"
autowire="byName" />

3. 配置事务
<tx:advice id="advice">
<tx:attributes>
<tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>//第二次过滤,拦截所有update开头的方法
</tx:attributes>
</tx:advice>
<aop:config>>
          //第一次过滤,所有在org.ht.service包下的全符合条件(不包括子包)
<aop:advisor advice-ref="advice" pointcut="execution(* org.ht.service.*.*(..))" />
</aop:config>

打完收工,以上配置完成了为org.ht.service包下的所有类以update开头的添加了事务,看看,很简单吧。

注:http://220.130.0.97/javaweek/javaweekly.php这是红色地方写法规则。



------解决方案--------------------
在DAO中不要写事务
------解决方案--------------------