2017-10-19 157 views
0

我想刷新存储在当前事务中的所有实体到数据库(不通过commit提交当前事务)。JPA EntityTransaction flush

在这样做之前,我是否需要检查事务是否处于活动状态?

if (this.entityTransaction.isActive()) 
    { 
     this.entityManager.flush(); 
    } 

谢谢

+0

如果由于未知原因而未进行事务处理,并且正在进行将要丢失的更改,那么不应该抛出异常吗? – Chris

+0

@Chris你先生...有一点。但是“isActive”真的表明了什么?我认为它就像“系统中存在数据” - >将其刷新到数据库。 –

+0

不,isActive只是意味着有一笔交易已经开始。它没有说明持久化单元中的内容或已做出的更改。 Flush将确定是否有更改并只推送这些更改,但只应在头脑中有目标时调用,比如需要强制语句到数据库以便捕获代码中的乐观锁或约束问题,而不是等待直到交易提交。 – Chris

回答

0

根据该方法的Javadoc的EclipseLink的的EntityManager冲洗

https://www.eclipse.org/eclipselink/api/2.6/javax/persistence/EntityManager.html#flush()

无效的flush() 同步持久化上下文到底层数据库。 抛出: TransactionRequiredException - 如果没有交易,或者如果实体管理器尚未被加入到交易 的PersistenceException - 如果刷新失败

所以,是的,它看起来像你需要检查,其他的方法你可能会得到类型为“TransactionRequiredException”的异常