我需要将域对象(DO)存储到数据库中。
最简单的方法是在 DO 定义中添加一些 JPA 注释,例如 @Entity
、@SequenceGenerator
、@Table
等,但我不这样做不想将 DO 与另一个概念(如坚持)混合在一起。所以我使用单独的 DTO 对象并在此处放置注释。
因为我很棒Domain Driven Design follower 我不直接与数据库互连并使用Repository
模式。如果将来我从 RDBMS 迁移到例如NoSQL 所有更改都将仅在存储库中完成,并且我的 DO 将完好无损。
因此流程顺序为
DO -> 存储库 -> DTO -> DB
由于我的 DO 有很多字段,因此转换步骤非常麻烦,同时又非常琐碎:从 DO 获取 fieldA 并将其放入 DTO 中的 fieldA' (在某些情况下进行简单转换)例)。目前,我在单独的 Transformer
中手动执行此操作。
还有哪些其他(更好?)方法来执行此转换步骤?
更新
Good comparison bean 映射框架 Dozer与 Orika与手动字段映射方法
最佳答案
首先,将持久实体与域对象分开是一个很好的主意。我曾经处理过将两种方法混合在一起的设置,这导致我们之后陷入一片困惑。
您正在寻找的方法称为“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);
关于java - 域对象到持久实体的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36657143/