我正在使用 Hibernate 3.5.5.Final 和 JPA2
如何制作一个测试用例来测试 hibernate 锁是否正常工作?
我写了这个,但似乎测试在当前的 hibernate 版本中没有通过(在以前的版本中工作正常)
@Test(expected=OptimisticLockException.class)
public void testLock() {
EntityManager em = getEntityManager();
Foo foo1 = fooDAO.findById(1);
em.lock(foo1, LockModeType.WRITE);
foo1.setCode("code3");
em.flush();
}
编辑:
@Pascal:这就是第二种情况的意思?
@Test(expected=OptimisticLockException.class)
public void testLock() {
EntityManager em = getEntityManager();
em.getTransaction().begin();
Foo foo1 = fooDAO.findById(1);
em.lock(foo1, LockModeType.WRITE);
fooDAO.createHibernateQuery("update Foo set version=version+1 where id = 1");
foo1.setCode("code3");
em.flush();
}
谢谢
最佳答案
我在此测试中没有看到任何并发访问,IMO 没有理由失败。 如果您想测试版本更新的乐观锁定行为,您需要测试如下内容:
- 在持久性上下文 1 中读取 Id = X 的 Foo(版本为 N)
- 在持久性上下文 2 中读取 Id = X 的 Foo(版本为 N)
- 对 PC 1 中的 foo 实例进行一些更改
- 对 PC 2 中的 foo 实例进行一些更改
- 刷新并提交 PC 1 中的更改//应该没问题(版本变为 N + 1)
- 刷新 PC 2 中的更改//应该抛出异常
使用单个持久性上下文和 SQL 查询是另一种选择:
- 在持久性上下文 1 中读取 Id = X 的 Foo(版本为 N)
- 对 PC 1 中的 foo 实例进行一些更改
- 使用 SQL 更新 Foo set version = version + 1 WHERE id = X
- 刷新 PC 1 中的更改//应该抛出异常
另请参阅
关于java - jpa2 hibernate,一个测试实体锁定的测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3685398/