【问题标题】:jpa2 hibernate, a testcase to test lock over an entityjpa2 hibernate,一个测试实体锁定的测试用例
【发布时间】:2010-09-10 14:27:02
【问题描述】:

我正在使用 Hibernate 3.5.5.Final 和 JPA2

如何制作测试用例来测试休眠锁是否工作?

我写了这个,但是在当前的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();
}

谢谢

【问题讨论】:

  • 在什么情况下它不起作用?错误是什么?获取一个对象并验证它是一个适当的测试。
  • 我没有收到 OptimisticLockException

标签: java hibernate orm locking jpa-2.0


【解决方案1】:

我在这个测试中没有看到任何并发访问,它没有理由让 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 中的更改 // 应该抛出异常

另见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    相关资源
    最近更新 更多