【问题标题】:Regarding DTO pattern implementation关于 DTO 模式的实现
【发布时间】:2012-08-01 01:20:51
【问题描述】:

请告知什么是 DTO 模式,因为我从我的分析中得出它是数据传输对象模式,您能否在 Hibernate 或任何其他 java 示例中提供任何有关它的示例,谢谢

【问题讨论】:

    标签: java hibernate design-patterns


    【解决方案1】:

    DTO 是 EJB 2.1(统称为 Sun 蓝图目录)中可怕的持久性的解决方法之一。它用于从实体 bean 中提取数据并将其传递给数据层。来自该层的数据放置在 DTO 中并放入实体 bean。这仅适用于 bean 管理的持久性。

    这就是 DTO 的正式含义。今天,您在将数据从后端传输到前端(在客户端-服务器架构中)时也会发现这一点。

    如果您想在 Hibernate 中使用它,请创建一个查询/条件来选择您需要的列,然后使用 AliasToBeanResultTransformer 在 DTO 中设置这些列。 An example in the Hibernate documentation:

    List resultWithAliasedBean = 
        s.createCriteria(Enrolment.class)
            .createAlias("student", "st")
            .createAlias("course", "co")
            .setProjection(
                Projections.projectionList()
                    add( Projections.property("co.description"), "courseDescription" )
            )
            .setResultTransformer( new AliasToBeanResultTransformer(StudentDTO.class) )
        .list();
    
    StudentDTO dto = (StudentDTO)resultWithAliasedBean.get(0);
    

    【讨论】:

    • “DTO 是 EJB 2.1(统称为 Sun 蓝图目录)中发现的可怕持久性的解决方法之一。”我找不到这方面的参考,BluePrints 站点和 EAA 的 P 都提到了与远程处理有关的 DTO。此外,即使使用健全的 ORM,也有理由使用 DTO——它们准确指定调用数据访问代码的层需要哪些数据,而不是总是移交整个数据库。 (这也有助于防止 N+1 问题。)您是否使用它们取决于您的品味在 DRY 与明确程度之间的位置。
    • 来自Wikipedia“DTO 通常与数据访问对象结合使用以从数据库中检索数据。” 就是一个例子。我并不是说绝对没有理由使用 DTO,但我确实认为它被过度使用了。
    • 我并不是说这不是 DTO 的有效用例,因为它的简化定义是“在应用程序层之间传输数据的对象”。我争论的是,它旨在作为任何事情的解决方法。 (认为​​有正当理由有意识地使用它。)
    • 这些正当的理由并不是最初创建这种类型的对象(我不会称其为模式,因为它不是模式)的原因。如果您查看 Blueprint Catalog,您会发现这些“模式”的唯一目的是使 EJB 的使用更加容易。 EJB 3 的引入使其中一些已经过时,这让我想知道什么样的设计模式只在已弃用的技术中才有意义(不是在谈论 DTO)。当然,您不会从 Sun/Oracle 那里听到这个。我也看不出 Martin Fowler 会谈论 EJB 中的设计决策的原因。
    • This StackOverflow answer 反映了我对 DTO 的看法。我只是不同意最后一段中的最后三句话。
    猜你喜欢
    • 2020-10-28
    • 2020-11-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多