Spring Data:如何在外部类之外使用存储库的内部接口?

时间:2017-09-13 12:03:49

标签: java spring interface spring-data

当我有很多存储库接口时,我通常会使用这样的包装器:

@Component
public class RepositoryContainer(){

 @Autowired
 public Myrepo1 repo1;

 @Autowired
 public Myrepo2 repo2;
 //and so on....
}

然后我用它:

@Service
public class Myservice(){

 @Autowired
 RepositoryContainer repos;

 public void service1(){
   repos.repo1.findBy...
 }

}

问题是这种做法生成了很多文件,因为每个存储库都是一个接口,因此存储库和实体存在相同的文件。

减少使用嵌套接口尝试的文件数:

@Repository
public class RepositoryContainer(){

  public interface Myrepo1 extends JpaRepository<Entity1, Long> {
  }

  public interface Myrepo2 extends JpaRepository<Entity2, Long> {
  }
  //and so on...
}

现在我很难过,因为我无法在课堂外访问我的存储库。 有没有办法做到这一点:

@Service
public class Myservice(){

@Autowired
RepositoryContainer repos;

  public void service1(){
  //I would like to do this :
   repos.Myrepo1.findBy...
  }

}

请注意,我已经在

中启用了嵌套发现存储库
@EnableJpaRepositories( considerNestedRepositories = true )

非常感谢

4 个答案:

答案 0 :(得分:5)

只需启用considerNestedRepositories注释中的参数EnableJpaRepositories

@SpringBootApplication
@EnableJpaRepositories(considerNestedRepositories = true)
public class Application {
    //...
}

然后你就可以注入你内心的内心&#39;回购:

@Service
public class Myservice(){

    @Autowired Myrepo1 myrepo1;
    @Autowired Myrepo2 myrepo2;

      public void service1() {
          myrepo1.findBy...
          myrepo2.findBy...
      }
}

我认为没有另一种变体......

<强>更新

如果目标是拥有一种干净的代码&#39;我可以提出一种方法:

public interface MyRepo1 extends JpaRepository<Entity1, Long> {
}

public interface MyRepo2 extends JpaRepository<Entity2, Long> {
}

@Getter
@RequiredArgsConstructor
@Component
public class RepoContainer {

    private final MyRepo1 myRepo1;
    private final MyRepo2 myRepo2;  
}

@RequiredArgsConstructor
@Service
public class MyService() {

    private final RepoContainer repoContainer;

    public void method() {
        repoContainer.getMyRepo1().findBy(...);
        repoContainer.getMyRepo2().findBy(...);
    }
}

答案 1 :(得分:1)

在与@ Cepro0讨论之后我的解决方案:

@Repository
public class RepositoryContainer(){

  public interface Myrepo1 extends JpaRepository<Entity1, Long> {
  }

  public interface Myrepo2 extends JpaRepository<Entity2, Long> {
  }
   //I am using an inner bean to get my repositories
  @Component
  public class Container{
    @Autowired
    public Myrepo1 repo1;
    @Autowired 
    public Myrepo2 repo2; 
  }
}

然后:

@Service
public class Myservice(){

  @Autowired
  RepositoryContainer.Container repos;

  public void service1(){
   repos.repo1.findBy...
  }
}

这非常有效,从今天开始,我将继续减少每个存储库界面的文件数量并使用干净的代码,因为有时我们需要在服务中使用许多存储库,我们必须注入一个逐之一。

如果有人看到一些缺点,请告诉我。

答案 2 :(得分:0)

我支持@ Cepr0答案, 为了减少代码,您不必将实体与Repositories接口分开,可以将它们组合在一个类中,如下所示:-

@Entity
public class MyEntity{
//.....

  @Repository
  public static interface UserRepo extends JpaRepository<MyEntity,String>{

  }
}

然后

@SpringBootApplication
@EnableJpaRepositories(considerNestedRepositories = true)
public class Application {
    //...
}

答案 3 :(得分:0)

@ akuma8您的代码可以重构以删除多余的内部容器

@Component
public class RepositoryContainer(){

  @Repository
  public interface Myrepo1 extends JpaRepository<Entity1, Long> {
  }
  @Repository
  public interface Myrepo2 extends JpaRepository<Entity2, Long> {
  }

  public final Myrepo1 repo1;

  public final Myrepo2 repo2;

  @Autowired
  public RepositoryContainer(Myrepo1 repo1, Myrepo2 repo2) {
    this.repo1 = repo1;
    this.repo2 = repo2;
  } 

}