[英]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.