域对象持久化实体转换

时间:2016-04-15 21:30:51

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

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

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

由于我是一位出色的Domain Driven Design粉丝,因此我不会直接与DB互连并使用Repository模式。如果将来我从RDBMS迁移到例如NoSQL所有更改只会在Repository中完成,我的DO将完好无损。

因此流程序列是

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

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

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

更新

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

2 个答案:

答案 0 :(得分:2)

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

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

大多数bean映射器为同名的字段执行自动映射,可以为上面提到的“简单转换”定义额外的转换。以下是特定Web到数据库实体映射的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);

答案 1 :(得分:1)

如果您真的希望将来转移到NoSQL,而不是注释,您可以使用yaml,xml映射。

DO -> Repository -converting-> DTO -> DB
你在这里想做什么只是复制ORM的功能。 这将需要更多的时间,可能会产生新的错误,根本不值得。

您可以成功使用ORM进行访问。他们不会让你与框架结合,因为框架将在更高的抽象层次上运作 存储库是interface,因此您可以在将来创建NoSqlRepository,您的应用程序将正常工作。 (不计算数据迁移)