在我当前的项目中,我使用Hibernate的Spring Data JPA,但认为这是一个更普遍的问题,也应该覆盖“普通”的JPA。JPA:OptimisticLockException和级联
我不确定在使用@Version
时应如何处理OptimisticLockException
。
由于我的应用程序的工作原理,某些关系有CascadeType.PERSIST
和CascadeType.REFRESH
,其他关系也有CascadeType.MERGE
。
- 在哪里处理
OptimisticLockException
至于我可以告诉处理这个服务层上不会与CascadeType.MERGE
尤其是工作,因为随后的违规实体可以是一个需要由其他处理服务(我有一个实体类的服务)。
问题是我正在创建一个框架,因此服务上面没有图层,所以我可以“委托”给我的框架的用户,但似乎“弱和懒惰”。
- 确定违规的实体和字段如果发生OptimisticLockException,改变
,我如何才能哪个实体造成的问题,哪些领域发生了变化?
是的,我可以打电话给getEntity()
,但是如何将它转换为正确的类型,特别是如果使用CascadeType.MERGE?实体可以是多种类型,所以想到instanceof
的if/switch会出现,但这看起来像是地狱般的丑陋。
一旦我有正确的类型,我将需要获得除版本本身或lastModifiedDate之类的某些字段之外的所有版本之间的差异。
在我的脑海里还有HTTP 409,其中指出如果发生冲突,回应应该包含冲突的字段。
对于所有这些,是否存在“最佳实践模式”?
应该吗? HTTP 409表明响应应该包含关于出错的信息:冲突最有可能发生以响应PUT请求。例如,如果正在使用版本控制并且包含PUT的实体更改为与先前(第三方)请求发生冲突的资源发生冲突,则服务器可能会使用409响应来指示它无法完成请求。在这种情况下,响应实体可能会以响应Content-Type定义的格式包含两个版本之间的差异列表 –