当我有很多存储库接口时,我通常会使用这样的包装器:
@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 )
非常感谢
答案 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;
}
}