高分求spring hibernate 加注解事务管理的问题,

l562959279 2010-01-06 03:08:07
applictionContext.xml里的配置

<?xml version="1.0" encoding="UTF-8"?>
<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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!-- 配置sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>

<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean name= "/findIndex " class= "org.individual.chanmao.web.action.FindIndexAction"/>
<bean name= "/findProduct " class= "org.individual.chanmao.web.action.FindProductAction"/>
<bean name= "/findAdvert " class= "org.individual.chanmao.web.action.FindAdvertAction"/>
<bean name= "/findBackGround " class= "org.individual.chanmao.web.action.FindBackGroundAction"/>
<bean name= "/findInformation " class= "org.individual.chanmao.web.action.FindInformationAction"/>
<bean name= "/findOrder " class= "org.individual.chanmao.web.action.FindOrderAction"/>
<!-- 配置事务的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="*" propagation="REQUIRES_NEW"/>
</tx:attributes>
</tx:advice>
<!-- 那些类的哪些方法参与事务 -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* org.individual.chanmao.web.action*.*(..))"/>
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
</aop:config>
</beans>


action里的类都被spring管理了,但是我写的dao类,biz类都没有被管理,还有底层的通用dao也没有被管理,该怎么做呢!~~

...全文
246 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
timeriver_wang 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 l562959279 的回复:]
引用 3 楼 reandyner 的回复:
是的只要业务类加上事务管理就好了


业务类上加上事务管理?不太明白,怎么加上?我的项目包名是:org.individual.chanmao,
下边有biz,dao,entity,web和src同级目录下还有一个最底层的通用dao,net.taobaoge.ualink.framework,业务类里所有的发放都是调用这个底层dao 里的!~~那该怎么加啊,这种方法我是第一次用,郁闷死了!~~
[/Quote]
把execution(* org.individual.chanmao.web.action*.*(..))改成
比如execution(* org.individual.chanmao.biz.*.*(..))

请看一楼回复

islandrabbit 2010-01-06
  • 打赏
  • 举报
回复
mark
bolink5 2010-01-06
  • 打赏
  • 举报
回复
首先 说明下,spring的声明式事务,按我个人的经历来说,是配置在业务层,也就是在service层。
具体你可以参考下如下的代码:

<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!-- 事务拦截器,激活事务管理器所必须的bean -->
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<!-- 配置事务属性 -->
<property name="transactionAttributes">
<props>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- 定义事务处理代理bean,他需要两个属性,一个是指定需要代理的bean,另一个是代理bean所需的事务拦截器 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>tempService</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
<!-- 业务逻辑层 -->
<bean id="tempService"
class="com.cj.transaction.service.TempService" abstract="false"
lazy-init="default" autowire="default" dependency-check="default">
<property name="userDAO">
<ref bean="userDAO" />
</property>
<property name="deptDAO">
<ref bean="deptDAO" />
</property>
</bean>
<bean id="userDAO" class="com.cj.transaction.hibernate.UserDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="deptDAO" class="com.cj.transaction.hibernate.DeptDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>

如果模块过多话,可以考虑用自动创建事务代理的方式
<!-- 自动代理 -->
<bean id="autoproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Service</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>



我在项目中基本上如上配置的。
l562959279 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 reandyner 的回复:]
是的只要业务类加上事务管理就好了
[/Quote]

业务类上加上事务管理?不太明白,怎么加上?我的项目包名是:org.individual.chanmao,
下边有biz,dao,entity,web和src同级目录下还有一个最底层的通用dao,net.taobaoge.ualink.framework,业务类里所有的发放都是调用这个底层dao 里的!~~那该怎么加啊,这种方法我是第一次用,郁闷死了!~~
reandyner 2010-01-06
  • 打赏
  • 举报
回复
<bean id="tx"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<tx:advice id="txAdvice" transaction-manager="tx">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="dele*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor pointcut="execution(* *.service.*.*(..))"
advice-ref="txAdvice" />
</aop:config>
reandyner 2010-01-06
  • 打赏
  • 举报
回复
是的只要业务类加上事务管理就好了
牛叔 2010-01-06
  • 打赏
  • 举报
回复
dao包里的还要事务管理干嘛?
楼主明显晕了,莫非dao包里面也有数据操作的相关调用?
我也晕了,
只有业务类才需要吧?
timeriver_wang 2010-01-06
  • 打赏
  • 举报
回复
问题在这里,<aop:pointcut id="allManagerMethod" expression="execution(* org.individual.chanmao.web.action*.*(..))"/>

通过execution()你可以给任意指定的“包”“类”“方法”加事务

当然一般情况下只需要给service加事务,因为它是业务层,可以很好地表达一个多个业务操作

把execution(* org.individual.chanmao.web.action*.*(..))改成
相应的service的路径
比如execution(* org.individual.chanmao.persistent.service.*.*(..))
解释一下这里的通配符
第一个*,表示返回类型任意
第二个*,表示service包下的所有类
第三个*,表示类的所有方法
(..),表示任意多个的参数


81,114

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧