2015-03-27 8 views
0

У меня есть объект с именем пользователя, который версионный: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 

и изменения к пользователю отменяются, но изменения в выводе нет, и это проблема. Что я делаю не так?

+0

У меня нет времени проверить его, но попробуйте это: не используйте слияние вообще. Ваши изъятия прилагаются, и ваш пользователь подключен, чтобы изменения автоматически очищались в конце транзакции. Я предполагаю, что первое слияние увеличивает версию пользователя, а второе слияние пытается сохранить состояние использования еще раз (поскольку вывод содержит пользователя) – zbig

+0

Вы правы, сущности сохраняются в БД даже без использования слияния. К сожалению, это не меняет поведение, я получаю исключение, но снятие не отменяется. – user2451415

ответ

0

Может быть много возможных причин. Является ли ваша база данных транзакционной и у вас есть транзакция включена как в БД, так и в вашем приложении? Как вы получаете свои объекты вывода? Они управляют сущностями?

+0

Моя БД - PostgreSQL 9.3, которая должна быть транзакционной из того, что я понимаю. Мой applisation работает на JBoss 7.1, вот свойства из persistence.xml: <свойство Name = "hibernate.hbm2ddl.auto" значение = "обновление" /> имя = значение "hibernate.connection.autocommit" <Свойство = «ложные» /> объекты Снятия управляются entites и загружаются с EntityManager через типизированный запрос: List вывода = entityManager.createQuery («выбери д от абстинентного ш, где w.status =: wtatus», снятие. class) .setParameter ("status", Withdrawal.Status.NEW) .getResultList(); – user2451415

Смежные вопросы