Spring Data JPA:从相同的存储库接口定义实例化多个存储库,每个存储库都指向不同的数据库

时间:2016-04-28 14:06:45

标签: java spring jpa spring-data spring-data-jpa

我有一组实体类和存储库定义以及N个数据库,所有这些都具有模式。如何实例化指向每个N个数据库的N个存储库。

@Entity
public class Student {
}

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

使用数据库数量(http://www.baeldung.com/spring-data-jpa-multiple-databases)和使用动态数据源路由(http://spring.io/blog/2007/01/23/dynamic-datasource-routing/)制作尽可能多的存储库接口副本是我找到的两种解决方案。

但是,我需要的是像

@Component
public class Foo {

    @Autowired
    StudentRepository studentRepositoryForDatabase1;
    @Autowired
    StudentRepository studentRepositoryForDatabase2;

}

这可行吗?

1 个答案:

答案 0 :(得分:1)

N有多大?如果不应该创建类N次,那么您可能必须自己实例化SimpleJpaRepository(Class<T> domainClass, EntityManager em)(否则就是interface)。在那里,您可以传递所需数据库的EntityManager

伪代码,但它通常应该像这样工作:

//maybe spring is capable of injecting all ems here?
@Autowired
private List<EntityManager> ems;

@Autowired
private ApplicationContext ctx;

@Autowired
private ConfigurableBeanFactory bf;

int n = 10;
for (int i = 0; i < n; i++) {
    //you'd probably need a way to identify which "em" maps to which number
    CrudRepository dao = new YourBeanRepository(YourBean.class, emN);
    bf.registerSingleton("YourBean" + n, dao);
}

ctx.getBean("YourBean1");

一个问题:为什么你有多个具有相同模式的数据库?如果您想提供更多详细信息,也许您的应用程序或数据库设计在这里不正确。

更新:您可以尝试这样的事情:

public class YourBeanRepository<T> extends SimpleJpaRepository<T> {
    //repo containing your findFirstBy()...
    @Autowired
    private StudentRepository dao; //provide a getter

    public YourBeanRepository(Class<T> clazz, EntityManager em) {
        super(clazz, em);
    }
}