Как сделать управление транзакциями без использования аннотаций @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, чтобы каждая услуга в вашем пакете применялась к вышеуказанным настройкам транзакций.