JPA EntityManager的合并方法会导致OptimisticLockException吗?

假设我想合并一个分离的实体。 当我做

T mergedEntity = entityManager.merge(detachedEntity); 

entityManager将从数据库加载一个实体(与detachedEntity具有相同的标识符),并将detachedEntity中的所有数据复制到新加载的实体。 稍后我的交易结束时,该实体将被保存到数据库中。

但是,在并发方案中,数据库中的实体可以由实体之间的其他事务更新,首先在我的事务中加载,然后在事务结束时刷新。 在这种情况下,我想知道是否会抛出OptimisticLockException? 如果是这样,为什么合并API没有在Java doc中指定OptimisticLockException? http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#merge(T)

谢谢

因为merge()方法不会抛出此exception。 当内存中的实体状态将刷新到数据库时,将抛出此exception。 调用merge() ,调用flush()时,或者在提交之前,或者在执行查询之前,都不会发生这种情况。

JPA EntityManager的合并方法会导致OptimisticLockException吗?

不,不是直接的。

我想知道是否会抛出OptimisticLockException? 如果是这样,为什么合并API没有在Java doc中指定OptimisticLockException?

显然,只有在配置了乐观锁定时才会抛出OptimisticLockException 。 此外,由于它inheritance自java.lang.RuntimeException ,因此无论如何都不必声明merge方法。

但这都是假设,因为在合并阶段甚至没有抛出OptimisticLockException而是在刷新对数据源的更改时。