在Spring JPA中的通用存储库

23 浏览
0 Comments

在Spring JPA中的通用存储库

我们正在进行一个具有许多数据库表的Restful项目。尽管对这些表的操作几乎相同,主要是INSERT/UPDATE/DELETE/FETCH。

我的问题是:

我们是否需要为每个创建的实体(领域类)创建一个扩展JpaRepository的存储库,或者是否有创建一个通用存储库的选项,可以处理所有实体的上述功能?

即所有实体仅有一个通用存储库。

如果是这样,你能分享一个例子吗?

0
0 Comments

在使用Spring JPA进行插入/更新/删除操作时,通常需要创建一个通用的Repository类来处理这些操作。上述代码展示了一个简单的通用Repository类的实现,其中包含了插入、更新和删除操作的方法。

然而,这种简单的通用Repository类存在一些问题。首先,它没有使用Spring JPA提供的自动化特性,例如自动生成查询和持久化操作的方法。其次,它没有提供对事务的支持,这可能导致数据一致性问题。

为了解决这些问题,可以使用Spring Data JPA提供的更准确的代码实现。在 SimpleJpaRepository 类的实现中,使用了更多的功能和特性来处理插入/更新/删除操作。这个类继承了JpaRepository接口,并实现了对应的方法。

通过使用SimpleJpaRepository,可以更方便地进行插入、更新和删除操作,并且可以利用Spring Data JPA的自动化特性。此外,SimpleJpaRepository还提供了对事务的支持,确保数据的一致性。

总结起来,Generic Repository在Spring JPA中的问题是它没有充分利用Spring JPA的自动化特性和事务支持。为了解决这些问题,可以使用更准确和功能更强大的SimpleJpaRepository类来处理插入/更新/删除操作。通过使用SimpleJpaRepository,可以更方便地进行这些操作,并确保数据的一致性。

0
0 Comments

在使用Spring JPA时,有人提出是否有创建一个能够处理所有上述功能的通用仓库(Generic Repository)的选项?但是这种做法是错误的,因为你不应该为每个表/实体创建一个仓库,而应该为每个聚合根(Aggregate Root)创建一个仓库。如果想要了解更多详情,请参考《Are you supposed to have one repository per table in JPA?》。

其次,拥有一个通用仓库有点违背了Spring Data JPA的初衷,因为JPA已经有一个通用仓库,即EntityManager。因此,如果你只需要上述提到的操作,直接注入一个EntityManager就可以了,完全不需要使用Spring Data JPA。如果你希望在业务代码和JPA之间有一个中间层,你可以像这里描述的那样,将其封装在一个简单的仓库中。

最后,你将在某个地方有创建所有表的代码,你也将有所有实体的代码,以及用于测试的代码。每个都有一个简单的接口定义会有问题吗?

0