2017-07-28 60 views
0

我需要查询数据库的数量。数据库的数量可能会有所不同。CrudRepository项目列表

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

这是一个好主意,还是至少可以有一个存储库列表连接到不同的数据源或有另一种更好的方法?我已阅读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

我有一个建议,尝试SimpleJpaRepository。 (https://stackoverflow.com/questions/22116005/how-to-create-jpa-repository-dynamically-inside-a-class)。看起来很有希望。 –

回答

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> 

您需要与交易型= “RESOURCE_LOCAL”

的persistence.xml 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);