从TransactionProxyFactoryBean到声明式事务管理?

时间:2015-06-30 07:30:30

标签: spring transactions

我想从使用TransactionProxyFactoryBean的旧式事务管理迁移到spring推荐的Declarative事务管理。 因此,可以避免出现不时出现的交易的异常。

这是我的配置xml文件:

<beans  xmlns=...>

    <context:annotation-config/>
    <context:component-scan base-package="prof" />

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation">
            <value>WEB-INF/classes/hibernate.cfg.xml</value>
        </property>
    </bean>

    <import resource="prof-dao-spring.xml" />

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

    <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
        <property name="transactionManager">
          <ref bean="transactionManager"/>
        </property>
        <property name="transactionAttributes">
          <props>
            <prop key="save*">PROPAGATION_REQUIRED</prop>
            ...
            <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
          </props>
        </property>
    </bean>

    <bean id="ProfileService" parent="baseTransactionProxy">
     <property name="target">
      <bean class="tv.clever.hibernate.service.ProfileService"></bean>
     </property>
    </bean>

</beans>

ProfileService看起来像:

@Component
public class ProfileService {

@Autowired
@Qualifier("baseDAO")
protected BaseDAO baseDAO;

private static ProfileService profileService;

public ProfileService() {

    setProfileService(this);
}

public void setProfileService(ProfileService ps) {

            profileService = ps;
}

public void save(final Collection transientObjects) {

    baseDAO.save(transientObjects);
}

 ...
}

我需要从哪里开始?

1 个答案:

答案 0 :(得分:3)

假设您要在服务类上使用注释一个@Transactional,请将<tx:annotation-driven />添加到您的配置中,并删除TransactionalProxyFactoryBean声明以及将其作为父项使用的所有bean。

其他专业提示:

  1. @Service用于服务类,将@Repository用于daos
  2. {li> <context:annotation-config /><context:component-scan /> 隐含

    您的服务

    @Service
    @Transactional
    public class ProfileService { ... }
    

    配置

    <beans  xmlns=...>
    
        <context:component-scan base-package="prof" />
    
        <import resource="prof-dao-spring.xml" />
    
        <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="configLocation">
                <value>WEB-INF/classes/hibernate.cfg.xml</value>
            </property>
        </bean>
    
        <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
          <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
    
        <tx:annotation-driven />
    
    </beans>
    

    重新启动应用程序。