我在一个工程里找到的 ,跑的没问题,可以用。但是我要在里面加东西,事物加不上,看了原来工程的事物配置跟迷茫了,求解。原来工程配置如下:
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager" />
<!-- 配置事务拦截器bean -->
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value></value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean> 

解决方案 »

  1.   

    这是spring的声明型事务配置方式。
    改这个就行了<prop key="*">PROPAGATION_REQUIRED</prop>key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:
    PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
    PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
    PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
    PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
    PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
    PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
      

  2.   

    这个没有弄过,楼主你的可以了吗?
    我的疑问 transactionManager这个bean楼主好像没有在其它地方引用啊!难道spring的声明型事务不用在其它地方引用?
      

  3.   

    <bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager" />在工程里没有任何地方引用,也没有注入datasource 。但是删除的话起到报错。我也不清楚人家是怎么搞的,我是在他的工程里加了些东西,但是我加的怎么加事物把我难住了。因为看原来工程的事物配置读不明白,所以求解  
      

  4.   

    告诉你关键的就是在这里了<prop key="*">PROPAGATION_REQUIRED</prop>*代表所有的操作,CRUD
      

  5.   

    那是所有dao操作呢,还是包括service 里的操作也加上事物了
      

  6.   

    我现在想在我的一些service操作里加上事物,但是不知道怎么加了。例如如下service 方法:
    public void deleteImage(int id, String userid) {
    BkImage image = bkImageDAO.findById(id);
    Common.deleteFile(image.getPath());
    bkImageDAO.delete(image);
    }
    就是我的一些service方法里有多个 更新,删除,新增等操作的时候我怎么给他加上事物,我写的dao 是用的getHibernateTemplate()这个写的,感觉spring自己给加上事物了 , 请教 一下,我这改怎么写啊 
      

  7.   

    <prop key="find*">PROPAGATION_NOT_SUPPORTED</prop>
    <prop key="delete*">PROPAGATION_REQUIRED,PROPAGATION_SUPPORTS,PROPAGATION_REQUIRES_NEW</prop>
    <prop key="update*">PROPAGATION_REQUIRED,PROPAGATION_SUPPORTS,PROPAGATION_REQUIRES_NEW</prop>这几种,你网上搜下如何配置。
      

  8.   

    问下,service  和dao 需要同时加事物么
      

  9.   


    事物只要dao加了就行了,至于你那个问题不知道你添加的东西要不要和transactionAttributes关联,很久没用spring,忘的差不多了
      

  10.   

     事物可以配在 service 层啊 ,那我service 层 同时又删除 更新  怎么办,不就得加上事物么, 
    在servise 层 加上事物  ,dao 就不用加了好像 ,我看这么弄了也没出啥问题
      

  11.   


    这段事务是使用代理,事务拦截器实现的,主要侧重点
    <bean
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="beanNames">
    <list>
    <value></value>
    </list>
    </property>
    、、、、、
    上面的list中的value是需要代理的类,类的中方法就会被事务拦截,从而实现事务一致性处理。
    而list中可以使用通配符形式,比如*service,或者*DAO等等。如果自己要添加新的类,必须注意这点,不然事务不起作用