Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DTO模式是否已弃用?_Java_Design Patterns_Jakarta Ee_Application Design - Fatal编程技术网

Java DTO模式是否已弃用?

Java DTO模式是否已弃用?,java,design-patterns,jakarta-ee,application-design,Java,Design Patterns,Jakarta Ee,Application Design,在集群化的完整JavaEE应用程序中,DTO模式仍然有效吗?所讨论的应用程序使用EJB Hibernate和Struts with Spring等。在这种情况下传输域对象有什么问题吗 编辑:为了澄清我的问题,随着现代资源和JavaEE的改进,是否有理由不使用域对象?如果没有,那么DTO模式不是有点淡出,不应该在新的应用程序中使用吗?模式是纯粹的设计。模式没有“弃用”,但随着时间的推移(或过度使用),使用率会降低 就我个人而言,我不明白为什么不使用DTO 例如,在开源项目中,我们有实体代表虚拟化领

在集群化的完整JavaEE应用程序中,DTO模式仍然有效吗?所讨论的应用程序使用EJB Hibernate和Struts with Spring等。在这种情况下传输域对象有什么问题吗


编辑:为了澄清我的问题,随着现代资源和JavaEE的改进,是否有理由不使用域对象?如果没有,那么DTO模式不是有点淡出,不应该在新的应用程序中使用吗?

模式是纯粹的设计。模式没有“弃用”,但随着时间的推移(或过度使用),使用率会降低
就我个人而言,我不明白为什么不使用DTO
例如,在开源项目中,我们有实体代表虚拟化领域中的业务逻辑实体
这些实体应该由Hibernate注释(事实上,在我们开始研究Hibernate POC时,它们现在就是这样)进行注释,并充当DTO,然后具有将映射到它们(比如说,使用框架)并由客户端使用的clean-from注释对象
(我不喜欢客户端代码带有不必要的注释),或者实体应该作为传递给客户端的客户端对象(值对象),我们应该让其他类作为DTO实体

上述方法的缺点是,您可能有两个并行类图——一个用于DTO,一个用于值对象(由客户端使用)——但是,在设计中的许多情况下,存在一个折衷

您必须了解优点和缺点,并选择最适合您的(在我们的例子中,由于客户端是GWT,因此我们将更容易分离为两个类层次结构,一个是DTO/服务器端,也可以使用更多仅服务器端的注释进行注释,另一个发送到GWT客户端代码).

未被弃用。是否应该使用DTO模式取决于应用程序体系结构。例如,当您开发Web服务(使用JAX-WS或JAX-RS)时,您应该通过Web方法发送DTO,以便C#或Python客户端应用程序可以使用它,并且您的Web方法不应该返回具有Hibernate注释的类的对象,请记住,与其他语言相比,实体的创建不会包含这些注释或其他业务逻辑


编辑(根据您的评论):这取决于软件体系结构。例如,我正在从事一个SOA项目,我们在服务层和表示层使用DTO。更深入的内部,我们甚至使用DTO来处理服务内部的数据库通信,我们只使用SP来与DB通信,因此没有Hibernate或任何其他ORM工具可以在那里工作,我们可以使用,该框架也使用DTO。如今,在许多应用程序中都可以找到许多DTO模式

有关此问题的更多信息:

  • (基本上,任何DTO都是POJO)
编辑2:另一个信息来源,将解释使用DTO设计的主要原因,解释如下


结论:DTO不是一种反模式。DTO仅在您需要将数据从一个子系统传递到另一个子系统时使用,并且它们没有默认或标准的通信方式。

这是Java EE中非常有用的模式


我使用DTO将相关实体对象从EJB bean传输到UI层。实体对象在一个事务中从DB中提取(请参阅),并存储在DTO对象中。DTO在UI层中使用。

前端不是GWT,我在哪里暗示了这一点?它是JSP,包含大量javascript和jQuery。是的,zaske我想问的是使用它们是否有意义,因为现代的对象模型保存着数据。是的,在这种情况下,我理解DTO的使用。您正在DTO中发送结果。但是对于内部应用程序来说,使用DTO并没有多大用处,对吗?根据您的第一个示例,它是一种反模式,用于绕过实体bean不可序列化的事实。对于ORM,主要问题不存在。@Thihara,你搞错了。从EJB的正式定义来看,它现在被认为是一种反模式。从第一个链接的最后一行开始:“对于许多人来说,DTO和VO是一样的……大多数时候,它们遵循JavaBeans约定,因此也是JavaBeans。而且都是POJO”。不,我得到了这一部分。但困扰我的是,对于同一软件的子系统或模块,没有必要使用DTO进行数据传输。带有JPA或Hibernate注释的对象不会造成问题。对于Struts这样的框架,不需要使用DTO将数据传输到视图,因为域模型(hibernate对象)可以很好地工作。@Thihara如链接所述,在您提供的情况下,不需要使用DTO模式,因为hibernate对象将为您处理数据。如果一个子系统(如表示层)中的数据与另一个子系统(如域模型)中的数据非常不同,并且此“新对象”不是域模型的一部分,那么DTO模式可以帮助您。请注意,DTO不一定必须实现可序列化的接口,这只是他们遇到的问题的J2EE解决方案。