jpa2 hibernate,一个测试锁定实体的测试用例

时间:2010-09-10 14:27:02

标签: java hibernate orm locking jpa-2.0

我正在使用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();
}

由于

1 个答案:

答案 0 :(得分:2)

我在此测试中没有看到任何并发访问,没有理由让IMO失败。 如果要测试使用版本更新的乐观锁定的行为,则需要测试以下内容:

  • 在持久性上下文1(版本为N)中使用Id = X读取Foo
  • 在持久性上下文2中使用Id = X读取Foo(版本为N)
  • 对PC 1中的foo实例进行一些更改
  • 对PC 2中的foo实例进行一些更改
  • 在PC 1中刷新并提交更改//应该没问题(版本变为N + 1)
  • 刷新PC 2中的更改//应该抛出异常

使用单个持久性上下文和SQL查询是另一种选择:

  • 在持久性上下文1(版本为N)中使用Id = X读取Foo
  • 对PC 1中的foo实例进行一些更改
  • 使用SQL更新Foo set version = version + 1 WHERE id = X
  • 刷新PC 1中的更改​​//应该抛出异常

另见