我有多个用户。为了防止并发,我写了类似的东西:
@EJB
PersistenceManagerRemote persistenceManager;
persistenceManager.lock(decidableEntity, LockModeType.READ);
persistenceManager.refresh(decidableEntity);
这对我有用。但是,如果我坚持一些东西,然后我在同一个事务中调用此代码,那么我得到了错误。
javax.persistence.PersistenceException: org.hibernate.HibernateException: this instance does not yet exist as a row in the database
当我持久化实体时,在事务结束之前不会影响数据库上下文。因此,当我刷新时,它会尝试在数据库中查找实体,因此会出现错误。你有解决方案吗?我不能分成两个交易。我还应该考虑并发性。我能做什么?
答案 0 :(得分:4)
您需要调用em.flush()
将所有挂起的更改写入数据库。 persist()
仅将一个临时实体附加到持久化上下文。 Hibernate只在必要时刷新,以便在它们不存在时避免它们,并且能够将它们发送到批处理中。