Я новичок в 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 будет работать.
Чтобы 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>