2017-07-28 40 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);