簡體   English   中英

DDD,域實體/ VO和JPA

[英]DDD, domain entities/VO and JPA

我從DDD開始,你可以想象我的大腦沸騰了。

我的問題與我的域對象(實體,VO,...)有關,它代表我的域概念/邏輯以及如何持久/檢索它們。

藍皮書說,存儲庫是一種表示域對象集合的方式,負責與基礎架構層進行通信。 我在一些帖子中也讀到了infrastructura層,你必須使用hibernate,JPA或其他什么。

然后我看到這個Spring-data-jpa示例http://spring.io/guides/gs/accessing-data-jpa/我變得瘋狂。

口號是Spring-data-jpa是為了輕松創建存儲庫,之前的示例似乎將JPA注釋合並到域對象( customer )中。

樣品對嗎? 或者我是對的?

如果我是對的,域和基礎設施必須分開,這意味着要存儲我必須擁有的客戶:

  • 我的域層中的Customer類(代表客戶並具有所有邏輯操作)
  • CustomerRepository我的域層(從基礎架構層檢索或存儲客戶)
  • 基礎架構層中的Customer類,可能使用@Entity注釋
  • 一些CustomerReposityJPA知道如何從數據庫中存儲/檢索客戶。

謝謝你的任何澄清。

在DDD中,存儲庫是參與域的對象,但實際上是抽象出一些后備存儲。

如果使用JPA注釋注釋域對象,則持久性機制已滲入您的域。 您已將域結構綁定到持久性結構,這是不理想的。

您的JpaCustomerRepository (實現ICustomerRepository )可以將未注釋的域類( Customer )映射到帶注釋的JPA表示 - JPA客戶。 這樣可以將注釋保留在域類之外,因此更清晰。 它允許您獨立於域結構改變JPA持久性結構。 這種好處的代價是映射代碼的復雜性。

interface ICustomerRepository {}

class JpaCustomerRepository implements ICustomerRepository {
     void save(Customer customer) {
          JpaCustomer jpaCustomer = map(customer);
          save(jpaCustomer);
     }
}

class Customer {}

class JpaCustomer {}

我看不到您發布的鏈接,我從未將域驅動設計應用於Java世界。 從理論上講,您需要的是域層中的Customer聚合。 在您的域層中,存儲庫(用作接口)有空間,因此您將擁有ICustomerRepository 對於常見的持久性問題,您可能會有四個原型:

GetById(CustomerId id);
Add(Customer c);
Delete(Customer c);
Update(Customer c);

在基礎結構層中,您將提供主體(例如CustomerRepository ),在infrastracture層中,您可以將自己與技術(例如JPA)結合起來。

域層必須完全不了解基礎架構中使用的技術。 這樣做你可以完全改變實現細節(幾乎沒有麻煩)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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