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

标签 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();
}

谢谢

最佳答案

我在此测试中没有看到任何并发访问,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/

相关文章:

java - 如何在Java中读取仅包含1行或1个单词的文件

mysql - Log4j2 JPAAppender blob

java - HHH90001006 : Missing cache[default-update-timestamps-region] was created on-the-fly

java - 了解何时访问数据库与缓存

java - 如何限制 Hibernate 实体图中使用的列

hibernate - 如何换出 hibernate.cfg.xml 属性?

java - 在 Java 中将随机字符放置在数组板上

Java Applet : What is the usage of Init(), Start()、Stop() 和 Final()?

java - 如何从同一类中的另一个方法调用变量,以及调用该方法?

java - 如何将 Java 8 日期库与 Hibernate/JPA 一起使用?