Java Hibernate乐观锁定测试

Java Hibernate乐观锁定测试,java,hibernate,testing,Java,Hibernate,Testing,我知道以前有人问过这个问题,但我正在尝试使用版本字段测试Hibernate的乐观锁定特性 我已经看到了下面的答案,它概述了如何测试这一点 有人能确认我的测试是否正确,因为我没有得到我期望看到的StaleObjectStateException @Test(expected = StaleObjectStateException.class) public void optimisticLockingTest() { DummyEntity entity= new DummyEntity(

我知道以前有人问过这个问题,但我正在尝试使用版本字段测试Hibernate的乐观锁定特性

我已经看到了下面的答案,它概述了如何测试这一点

有人能确认我的测试是否正确,因为我没有得到我期望看到的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和版本

在每次
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注释