单元测试Hibernate的乐观锁定(在Spring中)

Mic*_*man 2 testing spring hibernate

我想编写一个单元测试来验证乐观锁定是否正确设置(使用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");
}
Run Code Online (Sandbox Code Playgroud)

此测试失败.你推荐什么作为最佳实践?

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

Mic*_*man 5

似乎根本不是将所有字段从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");
}
Run Code Online (Sandbox Code Playgroud)

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