JpaRepository集中式Getter Java设计

时间:2015-04-14 15:27:49

标签: java spring dao spring-data-jpa

我一直想知道如何为所有JpaRepository类的所有对象搜索/ getter方法设置集中式服务。

所以我现在说:

public interface StudentRepository extends JpaRepository<Student, Long>{}
public interface SchoolRepository extends JpaRepository<School, Long>{}

..以及其他一些对象存储库。

现在我有一个单独的服务类,我注入了相应的Repository bean。这引入了循环依赖的问题:例如,当我需要在StudentService内部查询学校时,我还需要在SchoolService中查询学生(两者都不能有其他服务)所以,我想要将它集中在一个只有1个方法的SearchService中,搜索(Object,Predicate)并将所有Repositories注入到这个1类中。然后所有服务都将使用仅注入此SearchService

任何人都可以帮忙推荐一个好的设计吗?现在我只能想象在searchStudent(Predicate)中创建多个搜索方法,例如searchSchool(Predicate)SearchService,并在搜索对象时调用正确的方法..但它有点看起来不那么优雅...... ..谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

  

所以,我想将它集中在一个只有一个SearchService中   有1个方法,搜索(对象,谓词)并拥有所有存储库   注入这一级。然后所有服务都只使用注入   SearchService。

我认为你不应该这样想。这违反了SRP,因为您的SearchService很快就会知道您软件中的每个其他实体。

考虑在这里添加缓存。如果你想缓存学生而不是学校怎么办?在您的场景中,您还必须将缓存逻辑放入SearchService中。而且这项服务很快就会变成全知,因为它必须知道如何缓存所有内容。

如果您想共享搜索逻辑,请使用它创建一些抽象存储库,并从此抽象存储库继承您的存储库。在这种情况下,您将能够轻松覆盖默认实现,以在每个具体类中包含一些额外的搜索逻辑。