spring - DDD - 在 Spring Data 中维护单独的域类和实体类

标签 spring spring-boot spring-data-jpa spring-data domain-driven-design

我正在开发一个 Spring Boot 项目,其中有两个名为 domainpersistence 的独立包。

domain 包主要包含域类(根据业务需求设计),而 persistence 包包含通过扩展 提供的存储库定义的存储库接口(interface)>Spring 数据

我在域类中使用了 Spring Data JPA 注释,并且在定义存储库接口(interface)时也直接使用这些类。这里一切都运转良好。

但我遇到的问题是,有人可能会认为域类不需要了解持久性实现,并且域类应该保持干净,而不会被 Spring Data JPA 注释污染。这让我觉得我应该使用一组不同的类(比如说具有或多或少属性的实体类)来实现持久性,以便我可以保持域类的干净。但如果我这样做;

  1. Spring Data 存储库将与这些实体类配合使用,我将无法开箱即用地使用基于接口(interface)的存储库,因为我总是必须将存储库返回的实体对象映射到域类
  2. 我相信在某个时候,我也会引入 DTO,当我达到这个级别时,将会有太多的映射(Entity Classes域类,然后从域类DTO)。我个人认为,从长远来看,这种映射将是一种开销。

摘要 - 我应该单独维护域模型类实体类还是应该将域模型类Spring Data JPA一起使用> 注释和 KISS?

最佳答案

我认为将存储库接口(interface)与域类分开是一个错误。存储库是域的一部分。它们的实现不是,但您不处理实现,因为它是由 Spring Data(和 JPA)提供的。

如果您的域类和实体类应该分开,则取决于它们是否有不同的需求。 您可能会遇到这样的场景:您需要对实体类进行建模以适应 JPA 或您使用的任何持久性技术的限制,并且您不想将其泄漏到您的域中。

但在您遇到这种情况之前,我认为没有必要将它们分开。

如果您担心实体上的注释,那么认识到注释是一种极其弱的依赖关系可能会有所帮助。即使在类路径上,您也可以使用没有注释的实体。所以从纯粹主义者的角度来看它们是一种气味,但实际上我仍然必须找到它们有问题的情况。

如果你真的想摆脱它们,你可能需要查看 jMolecules ,它为 DDD 概念提供与技术无关的注释,然后将其转换为 JPA 注释或您想要使用的任何内容。

关于spring - DDD - 在 Spring Data 中维护单独的域类和实体类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71853000/

相关文章:

java - AOP编程——ProceedingJoinPoint只支持around advice

java - 为什么父类中的@PostConstruct 方法在子类中的@PostConstruct 方法之后执行?

spring-boot - Spring Boot 和 Kafka : Broker disconnected

javascript - Spring Boot 无法为对象返回 JSON,但不能为对象列表返回 JSON

spring - Spring Data JPA 中的动态查询

java - Pageable 对象的 isPaged 方法

java - 在任何情况下,父级都不会延迟加载子级

jquery - Spring MVC 中未下载 CSV 文件

spring - Spring Data JPA 问题 - BeanEntityManagerFactory

mongodb - 如何在 spring-data mongodb 中将 updateOption 与 arrayFilters 一起使用?