当前位置: 首页 > 知识库问答 >
问题:

我需要为哪些实体创建Spring数据存储库?

鱼征
2023-03-14

在Spring Data JPA的“入门”示例中,我们创建了一个扩展CrudRepository的接口。但是,它只处理一个实体:

import org.springframework.data.repository.CrudRepository;

interface MyEntityRepository extends CrudRepository<MyEntity, Long> {
  // methods...
}

在现实世界的应用程序中,有许多实体(表),我们需要对它们进行CRUD操作。使用具有多个(相关或无关)实体的Spring数据JPA存储库的正确方法是什么?

我是否必须为每个实体创建接口并逐个自动连接它们(现在听起来这是一个非常疯狂的想法)?

共有1个答案

岑光熙
2023-03-14

Spring数据使用域驱动设计中定义的存储库的概念。存储库基本上代表了聚合根的集合,这些根又是您要访问的一些实体,并对其他实体实施业务约束。例如。如果您有一个由lineItem组成的order,则order将是聚合根,因为它控制lineItem等的生命周期,因此您将为order定义一个存储库,而不是为lineItem定义一个存储库。因此,到目前为止,并不是所有实体都要为其创建存储库。在您的领域建模中,决定哪些实体成为聚合根基本上是一个重要的部分。

另一个方面是,存储库通常由持久性机制支持,并且您不希望将业务逻辑直接编码到持久性API以保持其可测试性,而不必处理持久性API。这意味着,存储库将包含基本表示集合中所有聚合根的子集并由特定于存储的查询实现支持的查询方法。这只能以按聚合根的方式实现。

第三个也是最后一个方面是,存储库帮助您更容易地限制对持久化操作的访问,例如,您可以使用包作用域来强制客户端甚至使用专用服务,并基本上隐藏某个包中某个域对象的所有持久化操作。对于像EntityManager这样的通用持久性API,您无法控制谁从系统中的任何一点实际读取内容,因为它只能持久化持久性上下文中的每一个类型。

总结一下:存储库表示聚合的集合,并允许访问该集合的专用子集。Spring Data使创建这些存储库变得尽可能容易,而替代方案在体系结构上不那么理想(参见上面的推理)或更麻烦(如果必须手动实现的话)。为哪些实体创建存储库取决于您如何建模您的域,其中哪些是聚合根。

 类似资料:
  • 我想使用SpringDataRepository接口来执行本机查询——我认为这种方式最简单,因为复杂性较低。 但是当扩展接口时。

  • 我想问一个关于spring缓存注释和存储库创建的问题。 我正在尝试使用Spring Boot在redis中缓存我的值。(我有一个值,如果它不在缓存里,我需要缓存它,如果它在缓存里,我需要从那里获取它) null 我的问题是:如果我使用了上面的注释(@Cacheable、@CachePut和@CacheEvict),我是否应该通过扩展CrudRepository来为我感兴趣存储的类对象创建一个存储库

  • 我有一个映射到数据库视图的实体,我想避免spring为它创建表,我尝试了@Immutable注释,但它不起作用,我还希望程序在没有创建实体的情况下从脚本文件为它创建视图。 感谢任何帮助。 谢谢。

  • 我试图创建一个简单的网站,其中托管主题和评论。我已经从主题开始,并为它们创建了存储库: 我已经在servlet上下文中定义了存储库的路径。xml: 现在,我想在我的存储库中包含注释,但以下代码不起作用: 我的项目甚至都没建好。你能给我一个建议吗,如何为多个实体创建存储库(主题类和注释类是用@Entity声明的)? 我面对的是: TopicRepository类图标上有HDD图片 org.sprin

  • 它是否将其存储在缓存中?我有一个应用程序,但应用程序中没有任何地方。属性是提到的db详细信息。我可以通过邮递员存储数据和查询它。

  • 和类似的服务: 我用的是12个实体,大家的服务方式都一样。 谢谢!