【问题标题】:DTO's with Hibernate, Frontend Objects vs Backend Objects [closed]DTO 与 Hibernate、前端对象与后端对象 [关闭]
【发布时间】:2015-11-09 08:05:03
【问题描述】:

我从 Hibernate 4 开始,在一个使用 AngularJS 的 Web 项目中,当您想将实体 Java 类 (Hibernate) 与 GUI 一起使用时,我对一个典型情况有疑问,在一种情况下,我需要添加两个字段更多:键入名称和用户名以显示在前端,但此字段在我的模型中的另一个表中,对象模板只有 id (ManytoOne)。

这里的问题是,在这种情况下,最佳实践是什么,创建一个 DTO 或在您的类中添加这个新字段,但不与数据库进行映射?

【问题讨论】:

    标签: java hibernate jpa design-patterns


    【解决方案1】:

    我更喜欢使用 DTO:

    • 数据库层(您的存储库或 DAO)仅获取和返回模型实体。
    • Service 层仅获取和返回 DTO。

    所以服务层负责将 DTO 映射到实体,反之亦然。

    这将视图与数据库模型分离,并在将数据从服务器发送到客户端时提供更大的灵活性。

    将 DTO 映射到实体会生成大量代码,但最终往往会得到回报。您可以使用像 OrikaDozer 这样的库来帮助您解决这个问题。

    【讨论】:

      【解决方案2】:

      我可能会推荐使用 DTO。通过将字段添加到对象模型,您可以将模型与前端表示绑定在一起,并且两者都可以单独增长和更改。

      目前,您只有一个视图来显示此实体,但它可以更改,如果您使用实体的 3 种不同视图,您将必须向您的实体添加 3 种不同的方式来以相同的方式表示它对象。

      有些视图可能需要很少的信息,而其他视图可能需要更多信息。如果所有这些视图都使用相同的对象,则无论需要如何,所有信息都将被传递。

      我建议将业务模型与其表示分离。

      【讨论】:

      • 好的,很好,现在的问题是,将实体对象克隆到 DTO,是否有任何库来简化该过程,我在几个帖子的库中看到:lambdaj、dozer、Commons BeanUtils、对于这项任务,你最喜欢什么?
      • 如果您觉得信息将是通用和共享的,一个好的做法是创建接口来表示您的 DTO。我不知道那些库 lambdaj,dozer。 BeanUtils 可用于进行反射,但当您必须重构时可能会很棘手。只需创建一个 MyObjectForThisView 类,它将您的对象作为构造函数中的参数并仅提取有用的信息。
      • 最流行的库是 Orika 和 Dozer。我更喜欢使用 Orika (github.com/orika-mapper/orika),因为它非常可定制,比 Dozer 更快,并且易于使用和配置,无需使用 xml。他们的指南非常清晰且乐于助人 (orika-mapper.github.io/orika-docs)。此外,如果您想将它与 Spring 很好地集成,这里有一种方法 (github.com/dlizarra/orika-spring-integration)。
      【解决方案3】:

      在我看来,我认为最好从程序的客户端隐藏域模型(如实体对象)。一般来说,最好只从存储库访问您的域,即使您的服务也不能直接访问您的域模型对象。 (在 MVC 范式中)。所以最后我认为你最好在你的服务器中创建一个 DTO 并将它发送到你的客户端

      【讨论】:

      • 好的,非常感谢 Kaveh 的回答
      猜你喜欢
      • 2020-06-12
      • 2011-12-21
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多