2017-09-14 155 views
2

有些類是根據DDD的實體,並且有些類具有@javax.persistence.Entity註釋。他們應該是同一班嗎?還是JPA實體只是作爲映射器的機制(https://martinfowler.com/eaaCatalog/dataMapper.html)從數據庫加載DDD實體(並存儲它們)並保持在域模型之外?JPA實體和DDD實體應該是相同的類嗎?

如果數據庫元數據被分離並存儲在外部(例如,以XML格式),它會有所幫助嗎?如果這些類是實體,那麼邊界在哪裏?我認爲從XSD(例如,使用JAXB)或者使用MyBatis Generator數據庫生成的類不是DDD中理解的實體。

回答

2

這實際上是一個實現細節。他們可能會或不能依靠您的ORM的靈活性。例如,如果您的ORM允許映射您的域對象而不會對持久性問題造成污染,那麼這就需要較少的開銷和我要去做的方法。另一方面,如果你的ORM不夠靈活,那麼你可以採用務實的混合方法,其中你的AR和它的狀態是兩個不同的類,並且狀態類很容易被映射。請注意,AR仍然負責保護其狀態,並且狀態對象不會直接從AR外部訪問。該方法由Vaughn Vernon here描述。

+0

感謝您的精湛回答! 'AR' =='Aggregate root',我假設。我還沒有讀VV的書。因此,如果JPA實體被視爲隱藏在AR背後的普通DTO,那麼它一定沒問題。在這種情況下,我們是否應該爲同一個DTO圖形創建不多於一個AR類? –

0

您的JPA實體應該是域實體。爲什麼? 您的域名實體應表達一些強大的約束條件,例如通過

  • 包含參數的構造函數
  • 不公開所有制定者
  • 做驗證的寫操作

如果可能,域實體應該始終保持一個有效的商業實體。 通過引入某種映射器,您可以自動將任意東西寫入您的域實體,這基本上可以使您的約束無用。

另一種選擇是對JPA和導致冗餘的域實體施加相同的約束。

最好的辦法是讓您的JPA實體儘可能保持ORM不可知性。使用Hibernate,這可以使用配置類或XML文件來完成。但我不是Java EE/JPA的人,所以我很難給出一個好的實施建議。