我的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
注释的情况下执行读写操作?
答案 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>
当然,您可以使用更多的威尔卡,以便您的包中的每项服务都适用于上述交易设置。