我有一个使用Tapestry5(java webframework)和Hibernate制作的Web应用程序。现在我试图添加乐观锁定。所以我添加了一个版本属性和乐观锁定工作,所以这很容易和快速。最佳实践Hibernate乐观锁定和Web应用程序
但是,由于我的web应用程序使用“session-per-request”模式,我不确定使用此乐观锁定的最佳方式是什么。
会发生什么:
用户A打开页面,其中已赋值从entityA形式(第1版)。
UserB用加载了entityA(版本1)中的值的表单打开页面。
UserA更改一些值并提交表单。 - >新请求检索entityA(版本1)并提交更改(entityA现在为版本2)
UserB更改一些值并提交表单。 - >新请求检索entityA(版本2),并承诺改变(entityA现在是第3版)
应该发生用户B的
的变化不应该犯了什么。但是由于session-per-request模式,Hibernate发生乐观锁定错误的时间窗口可能会缩短到提交后的新请求的时间范围内,这不是所期望的结果。
可能的解决方案
经过一番研究,我发现了以下内容:
- 隐藏字段添加到窗体与实体版本
我可以用这个值来设置提交之前的实体版本,但Hibernate文档不建议设置此值。 另外它只在实体分离并重新连接时才起作用,否则手动设置的版本值将被Hibernate忽略。
其次我可以使用这个版本值来做一个手动检查,如果表单呈现时的版本与提交请求中加载的实体版本相同。然后根据需要自己抛出一个OptimisticLockingException。
- 将分离的实体到HttpSession中,所以我不必再重新装上提交
结论
这些方法的工作,但似乎没有太大的实用我很容易犯错误。 所以我想知道其他人是如何实现这个问题的。