域对象到持久实体转换

Domain object to persisting entity converting

我需要将域对象 (DO) 存储到数据库中。

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

因为我是一个很棒的 Domain Driven Design 追随者,所以我不直接与数据库互连并使用 Repository 模式。如果将来我从 RDBMS 迁移到例如NoSQL 所有更改都将仅在存储库中完成,我的 DO 将完好无损。

因此流程顺序为

DO -> Repository -converting-> DTO -> DB

由于我的 DO 有很多字段,转换步骤非常繁琐,同时也很琐碎:从 DO 中获取 fieldA 并将其放入 DTO 中的 fieldA' (在某些情况下进行简单的转换)。目前我在单独的 Transformer.

中手动执行此操作

执行此转换步骤的其他(更好?)方法是什么?

更新

Good comparison of bean mapping frameworks Dozer vs Orika 与手动字段映射方法

首先,将持久化实体与领域对象分开是个不错的主意。我曾经处理过将两种方法混合在一起的设置,然后导致我们完全混乱。

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

大多数 bean 映射器对同名字段执行自动映射,可能会为您上面提到的 'simple transformations' 定义额外的转换。下面是特定 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);

如果你将来真的想迁移到 NoSQL,你可以使用 yaml,xml 映射而不是注释。

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

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