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