JPA在具有DTO和乐观锁定的RESTful Web应用程序中合并?
我的问题是:在无状态Web应用程序中,JPA合并
是否有角色?
关于JPA中的操作,有很多关于SO的讨论。还有一篇关于这个主题的很棒的文章,它通过更手动的DI-Yourself流程(通过实体管理器找到实体并进行更改)对比了JPA合并。merge
我的应用程序具有丰富的域模型(ala 域驱动设计),该模型使用注释来利用乐观锁定。我们还创建了 DTO,作为 RESTful Web 服务的一部分,通过网络发送。创建此DTO层还允许我们将所需的所有内容发送给客户端,而不需要的任何内容。@Version
到目前为止,我知道这是一个相当典型的架构。我的问题是关于需要更新(即HTTP PUT)现有对象的服务方法。在这种情况下,我们有这两种方法1)JPA合并和2)DIY。
我不明白的是,JPA合并如何被视为处理更新的选项。这是我的想法,我想知道是否有我不明白的东西:
1) 为了正确地从有线 DTO 创建分离的 JPA 实体,必须正确设置版本号...否则就会抛出一个 OptimisticLockException。但是JPA规范说:
实体可以访问其版本字段或属性的状态,或者导出一个方法供应用程序访问该版本,但不得修改版本值[30]。仅允许持久性提供程序在对象中设置或更新 version 属性的值。
2)合并不处理双向关系...反向指向字段始终以 null 结尾。
3) 如果 DTO 中缺少任何字段或数据(由于部分更新),则 JPA 合并将删除这些关系或将这些字段清空。休眠可以处理部分更新,但不能处理 JPA 合并。DIY可以处理部分更新。
4)合并方法要做的第一件事是查询数据库中的实体ID,因此与DIY相比没有性能优势。
5)在DYI更新中,我们加载实体并根据DTO进行更改 - 没有调用或调用,因为JPA上下文实现了开箱即用的工作单元模式。merge
persist
我有这个直吗?
编辑:
6) 与延迟加载关系相关的合并行为在提供程序之间可能有所不同。