我有一组实体类和存储库定义以及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;
}
这可行吗?
答案 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);
}
}