【发布时间】:2016-08-08 00:23:57
【问题描述】:
我需要将域对象 (DO) 存储到 DB 中。
最简单的方法是在 DO 定义中添加一些 JPA 注释,例如 @Entity、@SequenceGenerator、@Table 等,但我不想将 DO 与其他概念混为一谈,例如 persisting .所以我使用单独的 DTO 对象并在此处放置注释。
由于我是 Domain Driven Design 的忠实追随者,我不直接与 DB 互连,而是使用 Repository 模式。如果将来我从 RDBMS 迁移到例如NoSQL 所有更改都将仅在存储库中完成,我的 DO 将保持不变。
因此流序是
DO -> 存储库 -converting-> DTO -> DB
由于我的 DO 有很多字段,因此转换步骤非常麻烦,同时也非常简单:从 DO 中获取 fieldA 并将其放入 DTO 中的 fieldA'(在某些地方进行简单的转换例)。目前我在单独的Transformer 中手动执行此操作。
还有哪些其他(更好的?)方法可以执行此转换步骤?
更新
Good comparison 的 bean 映射框架 Dozer vs Orika vs 手动字段映射方法
【问题讨论】:
-
似乎过度设计。
-
@Everv0id 你能提出更好的方法吗?
-
这似乎是 orm 映射器的用途,除非您的 db 中有东西保证 dto 对象。但是您将不再有 1-1 映射(并且您可以随时重新设计需要。YAGNI 也适用于此)
-
Java 世界中没有某种流畅的非实体映射吗?并不是说使用 Hibernate XML 文件很有趣,但至少您不必重新声明和映射整个额外的 DTO 层以保持与持久性无关。
-
有 Blaze-Persistence Entity Views(github.com/Blazebit/blaze-persistence#entity-view-usage) 这是一个允许基于 JPA 实体轻松创建 DTO 的库,但我不明白为什么需要区分 DO 和 DTO .为什么你的 DTO 不能简单地成为你的 DO?
标签: java jpa domain-driven-design dto domain-object