假设我想合并一个分离的实体。 当我做的时候
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)
感谢
答案 0 :(得分:3)
因为merge()
方法不会引发此异常。当内存中的实体状态将刷新到数据库时,将抛出此异常。调用merge()
时,在显式调用flush()
时,或在提交之前,或在执行查询之前,都不会发生这种情况。
答案 1 :(得分:3)
JPA EntityManager的合并方法是否会导致OptimisticLockException?
不,不是直接。
我想知道是否会出现OptimisticLockException 抛出?如果是这样,为什么合并API没有指定 Java doc中的OptimisticLockException?
如果你配置了乐观锁定,显然只能抛出OptimisticLockException
。此外,由于它继承自java.lang.RuntimeException
,merge
方法无论如何都不必声明它。
但这都是假设的,因为在合并阶段甚至没有抛出OptimisticLockException
,而是在刷新对数据源的更改时。