Отказ от ответственности: я никогда не пробовал, но я думаю, что это сработает. Это также может быть немного больше кода, чем вы хотите написать. Наконец, я предполагаю, что ваши подклассы WebApplication SpringWebApplication. Ты со мной так далеко?
План заключается в том, чтобы сообщить Spring, что мы хотим запускать операторы вашего метода onClick в транзакции. Для этого нам нужно сделать три вещи.
Шаг 1: добавьте PlatformTransactionManager в вашу веб-страницу:
@SpringBean
private PlatformTransactionManager platformTransactionManager;
Шаг 2: создайте статическое TransactionDefinition на своей веб-странице, на которое мы позже будем ссылаться:
protected static final TransactionDefinition TRANSACTION_DEFINITION;
static {
TRANSACTION_DEFINITION = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
((DefaultTransactionDefinition) TRANSACTION_DEFINITION).setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE);
}
Не стесняйтесь изменять настройки TransactionDefinition и / или перемещать определение в общее местоположение в зависимости от ситуации. Это конкретное определение инструктирует Spring запускать новую транзакцию, даже если она уже запущена, и использовать максимальный уровень изоляции транзакции.
Шаг 3: добавить управление транзакциями в метод onClick:
link = new Link("cancel") {
@Override
public void onClick() {
new TransactionTemplate(platformTransactionManager, TRANSACTION_DEFINITION).execute(new TransactionCallback() {
@Override
public Object doInTransaction(TransactionStatus status) {
Order order = orderDAO.load(orderId);
order.setCancelledTime(timeSource.getCurrentTime());
}
}
}
};
И это должно сработать!