CrudRepository项目列表

时间:2017-07-28 15:00:22

标签: java spring spring-data-jpa

我需要查询多个数据库。数据库的数量可以变化。

能够通过列表迭代它们看起来很方便。

这是一个好主意,还是至少可以将一个存储库列表连接到不同的数据源,还是有另一种更好的方法?

我已经阅读了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,但是类的体系结构会变得太复杂而且不合逻辑。

1 个答案:

答案 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);