Java Hibernate乐观锁定测试
我知道以前有人问过这个问题,但我正在尝试使用版本字段测试Hibernate的乐观锁定特性 我已经看到了下面的答案,它概述了如何测试这一点 有人能确认我的测试是否正确,因为我没有得到我期望看到的StaleObjectStateExceptionJava Hibernate乐观锁定测试,java,hibernate,testing,Java,Hibernate,Testing,我知道以前有人问过这个问题,但我正在尝试使用版本字段测试Hibernate的乐观锁定特性 我已经看到了下面的答案,它概述了如何测试这一点 有人能确认我的测试是否正确,因为我没有得到我期望看到的StaleObjectStateException @Test(expected = StaleObjectStateException.class) public void optimisticLockingTest() { DummyEntity entity= new DummyEntity(
@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和版本
在每次persist()
和merge()
之后,您需要使用EntityManager.flush()
或通过编程启动/提交事务来强制更新数据库
因此,代码应该是:
dummeyentity实体=新的dummeyentity(“名称”);
entityDao.persist(实体);
entityDao.flush();
分离(实体);
final dummeyentity newEntity=entityDao.findById(entity.getId());
newEntity.setName(“不同名称”);
entityDao.persist(newEntity);
entityDao.flush();
实体名称(“新名称”);
entity=entityDao.merge(entity);
entityDao.persist(实体);
它只调用entityManager.detach(实体)。其中entityManager用@PersistenceContext注释