gpt4 book ai didi

java - DDD、域实体/VO 和 JPA

转载 作者:IT老高 更新时间:2023-10-28 13:55:05 26 4
gpt4 key购买 nike

我从 DDD 开始,你可以想象我的大脑正在沸腾。

我的问题与我的领域对象(实体、VO、...)有关,它代表了我的领域概念/逻辑以及如何持久化/检索它们。

蓝皮书说存储库是一种表示域对象集合的方式,并负责与基础设施层进行通信。我还在一些帖子中读到了基础设施层是您必须使用 hibernate 、JPA 或其他任何东西的地方。

然后我看到这个 Spring-data-jpa 示例 http://spring.io/guides/gs/accessing-data-jpa/然后我就疯了。

标语说 Spring-data-jpa 是为了轻松创建存储库,而之前的示例似乎将 JPA 注释合并到域对象(customer)中。

样本对吗?还是我说的对?

如果我是对的并且域和基础设施必须分开,这意味着存储我必须拥有的客户:

  • 我的领域层中的 Customer 类(代表客户并具有所有逻辑操作)
  • a CustomerRepository un my domain layer(从基础设施层检索或存储客户)
  • 基础设施层中的 Customer 类,可能使用 @Entity 注释
  • 一些知道如何从数据库存储/检索客户的 CustomerReposityJPA

感谢您的澄清。

最佳答案

在 DDD 中,存储库是一个参与域但实际上抽象出一些后备存储的对象。

如果您使用 JPA 注释来注释您的域对象,那么您的持久性机制就会渗入您的域中。您将域结构与不理想的持久性结构绑定(bind)在一起。

您的 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 - DDD、域实体/VO 和 JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31400432/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com