【问题标题】:Domain object to persisting entity converting域对象到持久实体的转换
【发布时间】:2016-08-08 00:23:57
【问题描述】:

我需要将域对象 (DO) 存储到 DB 中。

最简单的方法是在 DO 定义中添加一些 JPA 注释,例如 @Entity@SequenceGenerator@Table 等,但我不想将 DO 与其他概念混为一谈,例如 persisting .所以我使用单独的 DTO 对象并在此处放置注释。

由于我是 Domain Driven Design 的忠实追随者,我不直接与 DB 互连,而是使用 Repository 模式。如果将来我从 RDBMS 迁移到例如NoSQL 所有更改都将仅在存储库中完成,我的 DO 将保持不变。

因此流序是

DO -> 存储库 -converting-> DTO -> DB

由于我的 DO 有很多字段,因此转换步骤非常麻烦,同时也非常简单:从 DO 中获取 fieldA 并将其放入 DTO 中的 fieldA'(在某些地方进行简单的转换例)。目前我在单独的Transformer 中手动执行此操作。

还有哪些其他(更好的?)方法可以执行此转换步骤?

更新

Good comparison 的 bean 映射框架 Dozer vs Orika vs 手动字段映射方法

【问题讨论】:

  • 似乎过度设计。
  • @Everv0id 你能提出更好的方法吗?
  • 这似乎是 orm 映射器的用途,除非您的 db 中有东西保证 dto 对象。但是您将不再有 1-1 映射(并且您可以随时重新设计需要。YAGNI 也适用于此)
  • Java 世界中没有某种流畅的非实体映射吗?并不是说使用 Hibernate XML 文件很有趣,但至少您不必重新声明和映射整个额外的 DTO 层以保持与持久性无关。
  • 有 Blaze-Persistence Entity Views(github.com/Blazebit/blaze-persistence#entity-view-usage) 这是一个允许基于 JPA 实体轻松创建 DTO 的库,但我不明白为什么需要区分 DO 和 DTO .为什么你的 DTO 不能简单地成为你的 DO?

标签: java jpa domain-driven-design dto domain-object


【解决方案1】:

首先,将持久性实体与域对象分开是个好主意。我曾经处理过两种方法混合在一起的设置,然后导致我们一团糟。

您正在寻找的方法称为“Bean 映射”。周围有很多这样的映射器,Dozer 似乎是使用最广泛的,但它是基于反射的,因此速度很慢。 Orika 在性能和可扩展性之间取得了很好的平衡,但它也导致了 Java EE 环境中一些奇怪的类加载问题。

大多数 bean 映射器对同名字段执行自动映射,可以为您上面提到的“简单转换”定义额外的转换。这是特定 Web 到 DB 实体映射的 Orika 配置示例(针对上述类加载问题应用了解决方法):https://bitbucket.org/__jtalk/jacra/src/default/JAcraEJB/src/main/java/me/jtalk/jacra/utils/mapper/MappersRegistration.java

然后您可以使用这些映射器,例如:

@Inject
@UserMapper
private BoundMapperFacade<UserEntity, UserWeb> userMapper;
...
UserEntity entity = userMapper.mapReverse(userWeb);
mapper.map(entity);

【讨论】:

    【解决方案2】:

    如果您将来真的想迁移到 NoSQL,可以使用 yaml、xml 映射来代替注释。

    DO -&gt; Repository -converting-&gt; DTO -&gt; DB
    您在这里尝试做的只是简单地复制ORM的功能。 这将花费更多时间,可能会产生新的错误,而且根本不值得。

    您可以成功地为实体使用 ORM。它们不会让你与框架耦合,因为框架将在更高的抽象级别上运行。
    Repository 是一个interface,因此您可以在将来创建 NoSqlRepository,您的应用程序将正常工作。 (不包括数据迁移)

    【讨论】:

    • Nosql 不能解决所有问题。小心使用
    • 看作者的题目,他说的是nosql。我不是在说“解决所有问题”。
    猜你喜欢
    • 2017-04-04
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多