Hibernate乐观锁测试

Hibernate optimistic locking test

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

我看到了下面的答案,其中概述了如何测试这个 Hibernate 3 : optimistic locking unit test

有人可以确认我的测试是否正确执行此操作,因为我没有收到我期望看到的 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,因此实体和新实体将具有相同的 ID 和相同的版本。

您需要在每次 persist()merge() 之后使用 EntityManager.flush() 或通过编程 start/commit 事务强制更新数据库。

所以代码是:

    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);