如何在不使用@transactional注释的情况下进行事务管理

时间:2017-05-31 11:26:32

标签: java spring hibernate spring-transactions transactional

我的xml中有一个事务管理器bean,如下所示:

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

并且会话工厂和数据源bean为:

<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
    <property name="URL" value="jdbc:oracle:thin:@localhost:1521:XE"/>
    <property name="user" value="user"/>
    <property name="password" value="password"/>
</bean>

<!--   Hibernate SessionFactory -->

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

会话工厂包含所有hbm个文件映射。

现在我有一个UserAddressManagerImpl如下:

public class UserAddressManagerImpl implements UserAddressManager{
 // methods to read and write in the database
}

并且这个bean是:

<bean id="userAddressManager"   class="com.sodiz.service.impl.UserAddressManagerImpl">  

现在,此UserAddressManagerImpl上没有@Transactional

每当我从这个类中进行任何读取操作时,它都能正常工作,但在进行写操作时它会失败。

我正在使用这个包装在jar中的类。所以我不想改变这门课。

那么,有没有办法在不使用@Transactional注释的情况下执行读写操作?

1 个答案:

答案 0 :(得分:1)

您必须使用方面来实现此目的而不使用注释:

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

<bean id="userAddressManager" class="com.sodiz.service.impl.UserAddressManagerImpl"/>

<tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="*"/>
        </tx:attributes>
</tx:advice>

<aop:config>
   <aop:pointcut id="userAddressManagerOperation" 
       expression="execution(* com.sodiz.service.impl.UserAddressManagerImpl.*(..))"/>
   <aop:advisor advice-ref="txAdvice" pointcut-ref="userAddressManagerOperation"/>
</aop:config>

当然,您可以使用更多的威尔卡,以便您的包中的每项服务都适用于上述交易设置。

相关问题