我一直想知道如何为所有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
,并在搜索对象时调用正确的方法..但它有点看起来不那么优雅...... ..谢谢你的帮助!
答案 0 :(得分:0)
所以,我想将它集中在一个只有一个SearchService中 有1个方法,搜索(对象,谓词)并拥有所有存储库 注入这一级。然后所有服务都只使用注入 SearchService。
我认为你不应该这样想。这违反了SRP,因为您的SearchService很快就会知道您软件中的每个其他实体。
考虑在这里添加缓存。如果你想缓存学生而不是学校怎么办?在您的场景中,您还必须将缓存逻辑放入SearchService中。而且这项服务很快就会变成全知,因为它必须知道如何缓存所有内容。
如果您想共享搜索逻辑,请使用它创建一些抽象存储库,并从此抽象存储库继承您的存储库。在这种情况下,您将能够轻松覆盖默认实现,以在每个具体类中包含一些额外的搜索逻辑。