[英]Domain object to persisting entity converting
我需要將域對象(DO)存儲到數據庫中。
最簡單的方法是在DO定義中添加一些JPA注釋,例如@ @Entity
,@ @SequenceGenerator
和@Table
等。但是我不想將DO與其他概念(例如持久化)混合使用。 因此,我使用單獨的DTO對象,並在此處放置注釋。
因為我是出色的域驅動設計追隨者,所以我不直接與數據庫互連,也不使用Repository
模式。 如果將來我從RDBMS遷移到NoSQL,則所有更改將僅在存儲庫中完成,而我的DO將保持不變。
因此,流程順序為
做->存儲庫-轉換-> DTO-> DB
由於我的DO包含很多字段,因此轉換步驟非常繁瑣,同時又非常瑣碎: 從DO中獲取fieldA並將其放入DTO的fieldA'中 (在某些情況下可以進行簡單轉換)。 目前,我在單獨的Transformer
手動執行此操作。
還有什么其他(更好的)方法來執行此轉換步驟?
UPDATE
首先,將持久實體與域對象分開是一個好主意。 我曾經處理過將兩種方法混合在一起的設置,然后導致我們一團糟。
您正在尋找的方法稱為“ 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);
如果您將來確實希望使用NoSQL,則可以使用yaml,xml映射來代替注釋。
DO -> Repository -converting-> DTO -> DB
您在這里試圖做的只是復制ORM的功能。 這將花費更多的時間,可能會產生新的錯誤,根本不值得。
您可以成功地將ORM用於實體。 它們不會使您與框架耦合,因為框架將在更高的抽象級別上運行。
Repository是一個interface
,因此您將來可以創建NoSqlRepository,並且您的應用程序將正常運行。 (不計算數據遷移)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.