我需要查询多个数据库。数据库的数量可以变化。
能够通过列表迭代它们看起来很方便。
这是一个好主意,还是至少可以将一个存储库列表连接到不同的数据源,还是有另一种更好的方法?
我已经阅读了How to use 2 or more databases with spring? 。为了实现它,我必须知道数据库的数量,但它可能会有所不同。
我试过了:
@Entity
public class Member{}
public interface MemberRepository extends CrudRepository<Member, Long> {
}
@Component
@ConfigurationProperties("myClass")
public class MyClass {
@Autowired
private MemberRepository memberRepository;
}
@Component
@ConfigurationProperties("myClassHub")
public class MyClassHub {
@Autowired
private List<MyClass> myClasses;
}
这对我来说是合乎逻辑的。但我无法理解如何配置此列表项。 这样的配置不起作用。
application.yml
myClassHub:
myClasses:
-
spring:
datasource:
url: jdbc:mysql://url
username: username
password: password
-
spring:
datasource:
url: jdbc:mysql://url
username: username
password: password
pom.xml中的我有:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
我还考虑过使用AbstractRoutingDataSource,但是类的体系结构会变得太复杂而且不合逻辑。
答案 0 :(得分:0)
最后我找到了解决方案。 我们的想法是使用SimpleJpaRepository而不是CrudRepository。 但这有点棘手。
我的例子:
的pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
您需要在persistence.xml中使用transaction-type =&#34; RESOURCE_LOCAL&#34;
配置单位的persistence.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="my-JPA" transaction-type="RESOURCE_LOCAL">
</persistence-unit>
</persistence>
然后你需要一个包含属性的地图(网址,驱动程序,用户,密码......) 你可以得到它们@Autowired或填写运行时:
Map dbProperties;
dbProperties = new HashMap();
dbProperties.put("javax.persistence.jdbc.driver", "com.mysql.jdbc.Driver");
dbProperties.put("javax.persistence.jdbc.url", "jdbc:mysql://url/database");
dbProperties.put("javax.persistence.jdbc.user", "user");
dbProperties.put("javax.persistence.jdbc.password", "password");
EntityManager和EntityManagerFactory:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-JPA", dbProperties);
EntityManager entityManager = emf.createEntityManager();
最后:
jpaRepository = new SimpleJpaRepository<Member, Long>( Member.class, entityManager);