在我当前的项目中,我将 Spring Data JPA 与 Hibernate 一起使用,但认为这是一个更普遍的问题,也应该涵盖“普通”JPA。
我不确定OptimisticLockException
在使用@Version
.
由于我的应用程序的工作方式,一些关系有CascadeType.PERSIST
,而CascadeType.REFRESH
另一些关系也有CascadeType.MERGE
。
- 在哪里处理
OptimisticLockException
据我所知,在服务层上处理这个问题不会特别有效,CascadeType.MERGE
因为有问题的实体可能是需要由另一个服务处理的实体(我每个实体类都有一个服务)。
问题是我正在创建一个框架,因此服务之上没有层,所以我可以将其“委托”给我的框架的用户,但这似乎“弱而懒惰”。
- 确定有问题的实体和已更改的字段
如果发生 OptimisticLockException,如何获取导致问题的实体以及更改了哪些字段?
是的,我可以打电话getEntity()
,但我如何将其转换为正确的类型,尤其是在使用 CascadeType.MERGE 的情况下?实体可能有多种类型,所以instanceof
会想到一个 if/switch ,但这看起来像地狱一样丑陋。
一旦我有了正确的类型,我就需要获取版本之间的所有差异,不包括某些字段,如版本本身或 lastModifiedDate。
在我的脑海里还有 HTTP 409,它指出在发生冲突的情况下响应应该包含冲突的字段。
这一切是否有“最佳实践模式”?