精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-23
最后修改:2008-12-23
现在想使用事务 action代码大致如下 public ActionForward addOrg( orginfoDAO.insert(orginfo); userDAO.insert(userInfo); } action里有这样的两个操作,分别用两个dao去处理,我想加上事务处理,使用的spring配置好像还是1.X的(见笑) 使用HibernateTransactionManager 和TransactionProxyFactoryBean类去管理事务,在target里设置target为action的bean name <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <bean id="orgManagerProxy" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"><ref bean="transactionManager"/> </property> <property name="transactionAttributes"> <props> <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="add*">PROPAGATION_REQUIRED,Exception</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> <property name="target"> <ref="/userOrgManager"> </property> </bean> action bean定义如下 <bean name="/userOrgManager" class="web.manager.ManagerAction"> <property name="baseDAO"> <ref local="baseDAO"/> </property> <property name="userDAO"> <ref local="userDAO"/> </property> <property name="orginfoDAO"> <ref local="orginfoDAO"/> </property> </bean> 但是这样配置是不生效的,直接使用TransactionProxyFactoryBean去管理dao的话,只能是单个dao进入事务管理,比较郁闷,如果有service层的话,可以用action去调用包装好的带事务的service,但现在这样配置后使用action依然是没有包装过的原始action,不知道怎么配比较好,还是非得加service层呢?希望大家指教。我用编程式事务去管理是可以的,但是比较麻烦,想用直接注入实现一下。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-12-23
可以.....
还可以opensessioninview |
|
返回顶楼 | |
发表时间:2008-12-23
抛出异常的爱 写道 可以.....还可以opensessioninview 那请问我是哪里配置出问题了?谢谢指点! |
|
返回顶楼 | |
发表时间:2008-12-23
如果你没有用opensessioninview的话在调用dao之后hibernateTemplete会自动关闭session
|
|
返回顶楼 | |
发表时间:2008-12-23
框架调用的是/userOrgManager这个bean,你的事务配置根本不会起作用
|
|
返回顶楼 | |
发表时间:2008-12-23
最后修改:2008-12-23
<bean name="/userOrgManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"><ref bean="transactionManager"/></property> <property name="transactionAttributes"> <props> <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="add*">PROPAGATION_REQUIRED,Exception</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> <property name="target"> <bean class="web.manager.ManagerAction"> <property name="baseDAO"> <ref local="baseDAO"/> </property> <property name="userDAO"> <ref local="userDAO"/> </property> <property name="orginfoDAO"> <ref local="orginfoDAO"/> </property> </bean> </property> </bean> |
|
返回顶楼 | |
发表时间:2008-12-24
daquan198163 写道 框架调用的是/userOrgManager这个bean,你的事务配置根本不会起作用 嗯 我就是不知道怎么才能起作用 呵呵 必须得用service层么? |
|
返回顶楼 | |
发表时间:2008-12-24
herowzz 写道 如果你没有用opensessioninview的话在调用dao之后hibernateTemplete会自动关闭session 这个不是的吧?我直接在action里使用编程式事务是可以的 |
|
返回顶楼 | |
发表时间:2008-12-24
daquan198163 写道 <bean name="/userOrgManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"><ref bean="transactionManager"/></property> <property name="transactionAttributes"> <props> <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="add*">PROPAGATION_REQUIRED,Exception</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> <property name="target"> <bean class="web.manager.ManagerAction"> <property name="baseDAO"> <ref local="baseDAO"/> </property> <property name="userDAO"> <ref local="userDAO"/> </property> <property name="orginfoDAO"> <ref local="orginfoDAO"/> </property> </bean> </property> </bean> 谢谢大哥的详细解答 我用这个配置可以运行,但是还是没起作用 transactionAttributes里还必须把<prop key="*">给去了才行,不知道为什么action里调用的orginfoDAO.insert(orginfo); 不包括在 <prop key="insert*">内,也不算在 <prop key="add*">里,action用到的方法是addOrg(),加上<prop key="*">它就说是readonly的,不能进行insert操作。 我的baseDAO是userDAO和orginfoDAO的父类,是使用hibernateTemplate进行操作的,hibernate.connection.autocommit设置为true,不然不用事务没法保存数据,我查了查有人说这个配置下声明式事务也是有效的,spring会自动更改代理dean的autocommit属性 |
|
返回顶楼 | |
发表时间:2008-12-26
我猜测原因是ManagerAction的基类导致的, 因为框架不是直接调用ManagerAction的方法,而是同意调用Action基类的入口方法(例如handleRequest),然后反射调用你的具体方法,因此你需要为这个入口方法指定事务属性 简单办法就是用通配符把所以方法都包括进去: transactionAttributes设为<prop key="*">PROPAGATION_REQUIRED</prop> |
|
返回顶楼 | |