簡體   English   中英

域對象到持久實體轉換

[英]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映射框架的良好比較 DozerOrika和Manual字段映射方法

首先,將持久實體與域對象分開是一個好主意。 我曾經處理過將兩種方法混合在一起的設置,然后導致我們一團糟。

您正在尋找的方法稱為“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM