[英]Hibernate optimistic locking test
我知道以前已经有人问过这个问题,但是我正在尝试使用版本字段来测试Hibernate的乐观锁定功能。
我已经看到了以下答案,概述了如何测试此Hibernate 3:乐观锁定单元测试 。
有人可以确认我的测试是否正确执行了此操作,因为我没有得到我期望看到的StaleObjectStateException。
@Test(expected = StaleObjectStateException.class)
public void optimisticLockingTest() {
DummyEntity entity= new DummyEntity("name");
entityDao.persist(entity);
entityDao.detach(entity);
entity.setName("new name");
// Get new instance of the same entity
final DummyEntity newEntity = entityDao.findById(entity.getId());
newEntity.setName("Different name");
entityDao.persist(newEntity);
entity = entityDao.merge(entity );
entityDao.persist(entity);
}
该版本会在数据库更新之前增加。
因为所有这些代码都在一个事务中,所以当您执行entityDao.findById(entity.getId());
该entity.getVersion()
仍为0,因此entity和newEntity将具有相同的ID和相同的版本。
您需要使用EntityManager.flush()
或以编程方式启动/提交事务,在每个persist()
和merge()
之后强制对数据库进行更新。
因此,代码将是:
DummyEntity entity= new DummyEntity("name");
entityDao.persist(entity);
entityDao.flush();
entityDao.detach(entity);
final DummyEntity newEntity = entityDao.findById(entity.getId());
newEntity.setName("Different name");
entityDao.persist(newEntity);
entityDao.flush();
entity.setName("new name");
entity = entityDao.merge(entity );
entityDao.persist(entity);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.