2

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

最简单的方法是在 DO 定义中添加一些 JPA 注释,如@Entity,等@SequenceGenerator@Table但我不想将 DO 与其他概念(如持久化)混为一谈。所以我使用单独的 DTO 对象并将注释放在这里。

由于我是一名出色的领域驱动设计追随者,因此我不直接与 DB 互连并使用Repository模式。如果将来我从 RDBMS 迁移到例如 NoSQL,所有更改都将仅在 Repository 中完成,我的 DO 将保持不变。

因此流序列为

DO -> 存储库 - 转换 -> DTO -> DB

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

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

更新

bean映射框架Dozer vs Orika vs手动字段映射方法的良好比较

4

2 回答 2

4

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

您正在寻找的方法称为“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);
于 2016-04-15T22:01:29.680 回答
1

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

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

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

于 2016-04-16T09:26:12.977 回答