Как сделать управление транзакциями без использования аннотаций @transactional

У меня есть бин менеджера транзакций в моем xml следующее:

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</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 id="userAddressManager"   class="com.sodiz.service.impl.UserAddressManagerImpl">  

Теперь это UserAddressManagerImpl не имеет @Transactional в теме.

Всякий раз, когда я делаю какую-либо операцию чтения из этого класса, она работает хорошо, но при выполнении операции записи это не удается.

Я использую этот класс, упакованный в банку. Поэтому я предпочитаю не менять этот класс.

Итак, есть ли способ выполнить операции чтения и записи без использования @Transactional аннотации?

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>

Конечно, вы можете использовать больше wilcards, чтобы каждая услуга в вашем пакете применялась к вышеуказанным настройкам транзакций.

Другие вопросы по тегам