我想编写一个单元测试来验证是否正确设置了乐观锁定(使用Spring和Hibernate)。

我想让测试类扩展Spring的AbstractTransactionalJUnit4SpringContextTests

我要结束的是这样的方法:


@Test (expected = StaleObjectStateException.class)
public void testOptimisticLocking() {
    A a = getCurrentSession().load(A.class, 1);
    a.setVersion(a.getVersion()-1);
    getCurrentSession().saveOrUpdate(a);
    getCurrentSession().flush();
    fail("Optimistic locking does not work");
}


该测试失败。您推荐什么是最佳做法?

我尝试这样做的原因是我想将version传输到客户端(使用DTO)。我想证明,当DTO发送回服务器并与新加载的实体合并时,如果该实体在此期间被其他人更新,则保存该实体将失败。

最佳答案

似乎根本不是将所有字段从DTO(包括版本)转移到新加载的实体,尝试保存它,并在实体在DTO上被修改时被修改的情况下得到例外的选择。客户端。

这样做的原因是,假设您在同一会话中工作,Hibernate根本不在乎您对版本字段所做的操作。会话会记住版本字段的值。

一个简单的证明:


@Test (expected = StaleObjectStateException.class)
public void testOptimisticLocking() {
    A a = getCurrentSession().load(A.class, 1);
    getCurrentSession().evict(a); //comment this out and the test fails
    a.setVersion(a.getVersion()-1);
    getCurrentSession().saveOrUpdate(a);
    getCurrentSession().flush();
    fail("Optimistic locking does not work");
}


无论如何,感谢大家的帮助!

10-07 19:44
查看更多