java - 域对象到持久实体的转换

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

我需要将域对象(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 映射框架 DozerOrika与手动字段映射方法

最佳答案

首先,将持久实体与域对象分开是一个很好的主意。我曾经处理过将两种方法混合在一起的设置,这导致我们之后陷入一片困惑。

您正在寻找的方法称为“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/

相关文章:

java - 使用 hibernate 5 和 c3po 连接池在 java 应用程序中设置 vsession.program

hibernate - JPA 的乐观锁定是否知道在 Long.MAX_VALUE 之后循环到零?

java - 如何保证集合中项目的顺序

domain-driven-design - DDD 限界上下文集成 - 应用程序服务与领域服务与存储库

java - 从 Java 执行 .bat 文件,为什么 Eclipse 项目目录很重要?

java - 如何更好地改变java项目中处理异常的方式?

java - 基于 Java 的 Web 应用程序的 NLP 库(主题提取+情感分析)

分配给泛型类型的 Java 原始类型值运行时 getClss() 方法错误

transactions - 实现领域驱动设计和交易

java - DDD - 在拥有映射器类时不暴露 setter/getter