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

时间:2014-04-06 14:01:14

标签: java jpa

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

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)

感谢

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

  

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

不,不是直接。

  

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

如果你配置了乐观锁定,显然只能抛出OptimisticLockException。此外,由于它继承自java.lang.RuntimeExceptionmerge方法无论如何都不必声明它。

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