2012-01-16 2 views
1

У меня несколько пользователей. Чтобы предотвратить параллелизм, я пишу что-то вроде этого:Как сохранить и обновить в той же транзакции

@EJB 
PersistenceManagerRemote persistenceManager; 

persistenceManager.lock(decidableEntity, LockModeType.READ); 
persistenceManager.refresh(decidableEntity); 

это сработало для меня. Однако, если я что-то упорствую, а затем я вызываю этот код в той же транзакции, то я получил ошибку en.

javax.persistence.PersistenceException: org.hibernate.HibernateException: this instance does not yet exist as a row in the database 

Когда я сохраняю объект, контекст базы данных не выполняется до завершения транзакции. Поэтому, когда я обновляюсь, он пытается найти объект в базе данных, поэтому возникает ошибка. У тебя есть решение? Я не могу разделить на две транзакции. Я должен также рассмотреть возможность параллелизма. Что я могу сделать?

ответ

3

Чтобы написать все незавершенные изменения в базе данных, необходимо позвонить em.flush(). persist() только делает переходный объект привязанным к контексту персистентности. Спящий режим сбрасывается только при необходимости, чтобы избежать их, если это не так, и иметь возможность отправить затем в пакет.

+0

flush не записывается в базу данных. он просто пытается писать. – Iguramu

+0

Да, я это знаю. Я изменил слово «persist» на «write», чтобы сделать его более ясным. –

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