我是Spring Transaction的新手。我发现有些事情很奇怪,也许我确实理解得很清楚。我想在方法级别周围进行事务处理,而我在同一个类中有一个调用者方法,似乎不喜欢它,必须从单独的类中调用它。我不知道怎么可能。如果有人知道如何解决此问题,我将不胜感激。我想使用相同的类来调用带注释的事务方法。
这是代码:
public class UserService { @Transactional public boolean addUser(String userName, String password) { try { // call DAO layer and adds to database. } catch (Throwable e) { TransactionAspectSupport.currentTransactionStatus() .setRollbackOnly(); } } public boolean addUsers(List<User> users) { for (User user : users) { addUser(user.getUserName, user.getPassword); } } }
这是Spring AOP(动态对象和cglib)的局限性。
如果你将Spring配置为使用AspectJ处理事务,那么你的代码将起作用。
最简单且可能最好的选择是重构代码。例如,一个处理用户的类和一个处理每个用户的类。然后,Spring AOP的默认事务处理将起作用。
使用AspectJ处理事务的配置技巧
为了使Spring能够将AspectJ用于事务,必须将模式设置为AspectJ:
<tx:annotation-driven mode="aspectj"/>
如果你使用的Spring版本低于3.0,则还必须将其添加到Spring配置中:
<bean class="org.springframework.transaction.aspectj .AnnotationTransactionAspect" factory-method="aspectOf"> <property name="transactionManager" ref="transactionManager" /> </bean>