Как сохранить и обновить в одной транзакции - PullRequest
2 голосов
/ 16 января 2012

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

@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

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

1 Ответ

4 голосов
/ 16 января 2012

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

...