gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:10:13 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com