JPA:OptimisticLockException和Cascading

beg*_*er_ 4 jpa optimistic-locking

在我目前的项目中,我使用Spring Data JPA和Hibernate,但认为这是一个更普遍的问题,也应该涵盖"普通"JPA.

我不确定OptimisticLockException在使用时应该如何处理@Version.

由于我的应用程序是如何工作的一些关系,有CascadeType.PERSISTCascadeType.REFRESH,其他人也有CascadeType.MERGE.

  1. 在哪里处理 OptimisticLockException

据我所知,在服务层处理这个问题不会特别有效,CascadeType.MERGE因为那时违规实体可能是需要由另一个服务处理的实体(我每个实体类都有一个服务).

问题是我正在创建一个框架,因此没有服务上面的层,所以我可以将其"委托"给我的框架用户,但这似乎"软弱和懒惰".

  1. 确定违规实体和更改的字段

如果发生OptimisticLockException,如何获取导致该问题的实体以及更改了哪些字段?

是的,我可以打电话getEntity()但如何将其转换为正确的类型,特别是如果使用CascadeType.MERGE?该实体可以是多种类型,因此instanceof可以想到if/switch,但这看起来像地狱一样难看.

一旦我有正确的类型,我需要获得版本之间的所有差异,不包括某些字段,如版本本身或lastModifiedDate.

在我的脑海中还有HTTP 409,它表示如果冲突响应应该包含冲突的字段.

所有这些都有"最佳实践模式"吗?

JB *_*zet 5

乐观锁定的全部意义在于能够告诉最终用户:嘿,你试图保存这条重要信息,但其他人将它保存在你的背后,所以你最好刷新信息,决定你是否仍然想要保存它并可能输入一些新值,然后重试.

只是SVN喜欢,如果你试着提交一个文件,之前别人犯了新的版本,SVN迫使你更新你的工作副本和甲阶潜在的冲突.

所以我会像JPA那样做:它让调用者通过抛出异常来决定做什么.应在表示层中处理此异常.