在休眠实体和数据传输对象之间转换的好模式是什么?
-
14-10-2019 - |
题
我也有类似的问题和疑虑,即如何在冬眠实体和数据传输对象之间转换为由Web服务返回的数据传输对象,如以下问题:
这里提到的因素之一是,如果域模型更改,则在Web服务的情况下,一组DTO将保护消费者。
即使似乎会为我的项目添加大量代码,但这种推理似乎很合理。
我是否可以使用良好的设计模式将冬眠实体(将接口实现)转换为实现相同接口的DTO?
因此,假设以下两个实施“书”,我需要将bugientity.class转换为bookdto.class,以便我可以让JAXB序列化并返回。
再说一次,整个前景对我来说似乎很怀疑,但是如果有好的模式可以帮助处理这种转换,我很乐意获得一些见识。
是否有一些有趣的方法可以通过反思进行转换?还是我不考虑的“建造者”模式?
我应该忽略DTO模式并通过周围的实体吗?
解决方案
我应该忽略DTO模式并通过周围的实体吗?
我的偏爱通常是“是”。我不喜欢仅出于建筑或层纯度而创建的并行层次结构的想法。
DTO模式的最初原因是将实体EJB传递到视图层时EJB 1.0和2.0应用程序中的过度聊天。解决方案是将实体豆状态放入DTO。
通常给出DTO的另一个原因是禁止通过视图层进行修改。在这种情况下,DTO是不变的对象,没有行为。他们除了将数据渡轮到视图层外什么都不做。
我认为DTO是一种核心J2EE模式,它已成为反模式。
我意识到有些人会不同意。我只是发表自己的意见。这不是唯一的方法,也不一定是“正确”的方法。这是我的偏爱。
其他提示
在DTO的所有欢乐踢球中,都需要有逆势观点。
tl; dr-有时仍然有用。
DTO的优点是,您不必在域类中添加数十亿个注释。
您从@Entity开始。还不错。但是然后您需要jaxb,因此您添加@xmlelement等 - 然后您需要JSON,因此您添加诸如Jackson的@JsonManagedReference之类的东西可以与关系做正确的事,然后添加等等。
很快,您的Pojo不再那么简单了。有时会阅读有关“域驱动设计”的信息。
此外,您可以“过滤”一些您不希望视图所了解的属性。
我们不应该忘记,当实体处于托管状态时,它们不容易处理。这使他们将GUI形式传递成问题。更确切地说,要急切地处理子对象。这不能在会话中完成,使异常。因此,必须将它们与实体经理驱逐(分离)必须转换为适当的DTO。除非有库尔斯,否则我不知道的模式,我很高兴知道。
对于快速创建“相似”的DTO,没有一堆重复的获取/设置代码,您可以使用 Beanutils.copyproperties. 。该功能可帮助您快速将数据从DAO复制到DTO类。只需记住,有一个以上的普通库支持beanutils。
我知道这是一个古老的问题,但是想我会添加一个答案,以提供一个框架,以防其他人解决这个问题。
我们的项目具有JAXB注释的Pojos,它们与JPA注释的Pojos分开。我们的团队正在辩论如何最好地在两个对象(实际上数据结构)之间移动数据。
这是人们考虑的一种选择:
我们发现并正在尝试 推土机 哪个处理(1)相同名称,(2)XML映射和(3)自定义转换作为在两个pojos之间复制数据的方法。
到目前为止,它非常容易使用。