Spring Data 和 DDD - 持久性的域模型不可知论

Ale*_*rov 2 java spring domain-driven-design spring-data spring-data-jpa

您好,具有独立的持久性模型和域模型不可知的持久性是一种常见模式。我想了解 Spring Data 中如何解决这种模式。

我想象的方式是,如果我们使用没有 spring 数据的常规休眠,我们将拥有与域对象一起工作的存储库,这些域对象将在内部映射到 ORM 模型,然后将触发持久性。

如何使用 Spring Data 实现这一点,如果无法实现,可以使用哪些替代机制来使我们拥有与持久性无关的域模型?谢谢。

Jen*_*der 5

Spring Data 为您提供了 95% 的帮助,但它确实做出了一些妥协。

Spring Data 提供了独立于底层持久化技术的 Repositories。您可以看出,因为它们包含在 Spring Data Commons 中,所有其他模块都构建在基础模块之上。一个例子是CrudRepository. 因此涵盖了基本的 crud 操作。

此外,查询派生不会泄漏有关持久性存储的信息。

由于您所做的只是指定这些接口,您几乎可以得到您想要的东西,因为 Spring Data 正在创建实际的实现。

但这有其局限性。

  1. 您的实体通常需要注释。这些取决于商店。许多人认为这是一个可以接受的折衷方案,因为注释实际上并不包含依赖于商店的代码,他们只是说“嘿,如果你碰巧以<persistence technology x>下面的方式将它与地图一起使用......”。

  2. 更复杂的查询通常通过@Query在存储库方法上添加注释来实现。这些依赖于持久存储。如果你不喜欢它,你总是可以在单独的类中提供自定义实现,让你的接口持久性技术再次变得不可知。

  3. 使用某些技术(即 JPA),由于延迟加载和脏检查,存储特定行为会通过它们的工作方式泄漏到您的应用程序中。

如果你想 100% 存储不可知,我想除了滚动你自己的持久性之外别无他法,可能是通过将你的域模型复制到传输对象并使用 Spring Data 持久化那些。

但这会为开发人员以及运行时的 JVM 带来大量工作,从而带来一些人为的好处。