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

时间:2017-11-21 14:30:20

标签: java spring spring-data spring-data-jpa domain-driven-design

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

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

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

2 个答案:

答案 0 :(得分:2)

Spring Data可以让你获得95%的胜利,但确实会有所妥协。

Spring Data提供独立于底层持久性技术的存储库。你可以告诉它,因为它们包含在Spring Data Commons中,所有其他模块都建立在基础模块之上。一个例子是CrudRepository。因此涵盖了基本的粗暴行动。

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

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

但是这方面有局限性。

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

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

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

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

    但是这为开发人员和JVM在运行时创造了大量工作,以获得一些人为的好处。

答案 1 :(得分:1)

当结合使用REST,Hazelcast,JPA等技术时,我发现用Hibernate注释模型是多余的,然后将DataSerializeable放在顶部,然后可能会通过使用一些JSon属性进行标记在REST上下文中重用它。

为了消除某些依赖关系,一种方法是使用ORM.xml并实现自定义的Hazelcast序列化程序。这样,您的最终模型将既不依赖于Hibernate,也不依赖于Hazelcast。

使用其他映射器并添加第二层域对象的替代方法。正如Jens所说的那样,与此相关的开销。