我也有类似的问题和疑虑,即如何在冬眠实体和数据传输对象之间转换为由Web服务返回的数据传输对象,如以下问题:

在EJB3中使用数据传输对象被认为是最佳实践

这里提到的因素之一是,如果域模型更改,则在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之间复制数据的方法。

到目前为止,它非常容易使用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top