У меня есть объект с именем пользователя, который версионный:JPA @version и откат транзакции
@Entity
public class User{
...
@Version
private Long version;
и другим под названием Изъятие, что это не так.
В периодической @Transactional метода в классе @Singleton, я пытаюсь обновить пользователя на основе снятия Выступал:
for(Withdrawal withdrawal : withdrawals) {
User user= entityManager.find(User.class, withdrawal.getUser().getId());
user.setFunds(user.getFunds() - withdrawal .getFunds());
entityManager.merge(user);
withdrawal.setStatus(Withdrawal.Status.OK);
entityManager.merge(withdrawal);
}
Если изменить версию пользователя после того, как он читал, но прежде чем он слился, я получаю исключение:
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction
и изменения к пользователю отменяются, но изменения в выводе нет, и это проблема. Что я делаю не так?
У меня нет времени проверить его, но попробуйте это: не используйте слияние вообще. Ваши изъятия прилагаются, и ваш пользователь подключен, чтобы изменения автоматически очищались в конце транзакции. Я предполагаю, что первое слияние увеличивает версию пользователя, а второе слияние пытается сохранить состояние использования еще раз (поскольку вывод содержит пользователя) – zbig
Вы правы, сущности сохраняются в БД даже без использования слияния. К сожалению, это не меняет поведение, я получаю исключение, но снятие не отменяется. – user2451415