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);
我知道以前有人问过这个问题,但我正在尝试使用版本字段测试 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);