jav*_*r71 2 hibernate jpa optimistic-locking
我是新手使用"乐观锁定"机制 - 我使用的是hibernate(在Jboss中)和容器管理事务(CMT).我想在我的实体读取和实体更新之间处理这种情况,其他人在DB中更新同一个实体(即行).在这种情况下,我想抛出异常..
我用@Version注释了我的实体 - 就像
@Version
private Long version;
Run Code Online (Sandbox Code Playgroud)
现在,我很困惑,如果这对于版本管理来说已经足够了,或者我需要显式调用EntityManager.lock()api之类的
{
.
.
final QueryDTO queryDTO = entityManager.find(QueryDTO.class, id);
entityManager.lock(queryDTO, LockModeType.READ);
queryDTO.setStatus(updatedStatus);
entityManager.persist(queryDTO);
}
Run Code Online (Sandbox Code Playgroud)
提前致谢,
当通过@Version使用乐观锁定时,您根本不需要显式锁定(悲观锁定).当实体更新到数据库时,将发生以下查询:
UPDATE QueryDTO SET status=<updated status>, ...other values..., version=100 WHERE id=<id> AND version=99
如果更新失败(某人/某事已经改变了数据和版本),你会得到OptimisticLockException(因为你使用的是EntityManager,我认为这是关于JPA的,在"原始"Hibernate中它可能就像StaleStateException).
| 归档时间: |
|
| 查看次数: |
1195 次 |
| 最近记录: |