HDa*_*ave 16 java rest jpa dto web
我的问题是: JPA merge在无状态Web应用程序中是否有角色?
关于mergeJPA中的操作,有很多关于SO的讨论.还有一篇关于这个主题的文章,它通过一个更加手动的自己动手过程(通过实体管理器找到实体并进行更改)来对比JPA合并.
我的应用程序有一个丰富的域模型(ala域驱动设计),它使用@Version注释来利用乐观锁定.作为RESTful Web服务的一部分,我们还创建了DTO以通过线路发送.这个DTO层的创建还允许我们向客户端发送它需要的一切,而不是它没有.
到目前为止,我知道这是一个相当典型的架构.我的问题是关于需要UPDATE(即HTTP PUT)现有对象的服务方法.在这种情况下,我们有这两种方法1)JPA Merge,和2)DIY.
我不明白的是JPA合并如何被视为处理更新的选项.这是我的想法,我想知道是否有一些我不明白的事情:
1)为了从有线DTO正确创建分离的JPA实体,必须正确设置版本号...否则抛出OptimisticLockException.但JPA规范说:
实体可以访问其版本字段或属性的状态,或者导出应用程序用于访问版本的方法,但不得修改版本值[30].只允许持久性提供程序设置或更新对象中version属性的值.
2)Merge不处理双向关系......后向字段总是以null结尾.
3)如果DTO中缺少任何字段或数据(由于部分更新),则JPA合并将删除这些关系或使这些字段无效.Hibernate可以处理部分更新,但不能处理JPA合并.DIY可以处理部分更新.
4)合并方法将要做的第一件事就是在数据库中查询实体ID,因此没有DIY的性能优势.
5)在DYI更新,我们加载实体,并根据DTO的变化-有没有电话merge或persist为此事,因为JPA背景下实现了单位的工作格局开箱.
我有这个吗?
编辑:
6)关于延迟加载关系的合并行为可能因提供者而异.
Aff*_*ffe 13
使用Merge确实需要您发送和接收实体的完整表示,或者维护服务器端状态.对于琐碎的CRUD-y型操作,它简单方便.我在无状态网络应用程序中使用了很多,其中没有任何有意义的安全隐患让客户看到整个实体.
但是,如果您已将操作简化为仅传递直接相关信息,则还需要手动编写相应的服务.
请记住,在进行"DIY"更新时,您仍需要在DTO上传递版本号并手动将其与数据库中的版本号进行比较.否则,如果您使用更简单的合并方法,则不会获得跨越"用户思考时间"的乐观锁定.
您无法更改提供程序创建的实体的版本,但是当您使用new关键字创建自己的实体类实例时,它很好,并且希望在其上设置版本.
它将使持久表示与您提供的内存中表示匹配,这可以包括使事物为空.请记住,当合并一个对象时,该对象应该被丢弃并替换为merge返回的对象.您不应该合并对象然后继续使用它.它的状态不是由规范定义的.
真正.
最有可能的是,只要您的DIY解决方案也使用实体ID而不是任意查询.(对查询使用'find'方法还有其他好处.)
真正.