2016-03-04 75 views
2

當我想要在兩個數據庫之間工作時,我遇到了一個問題,我想使用數據庫1中的表1和數據庫2中的表2,我嘗試了很多方法,但似乎都沒有工作。在Spring引導中使用多個數據庫

spring.datasource.primary.url = jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8 
spring.datasource.primary.username = root 
spring.datasource.primary.password = xxxx 
spring.datasource.primary.driverClassName=com.mysql.jdbc.Driver 

spring.datasource.secondary.url = jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF-8 
spring.datasource.secondary.username = root 
spring.datasource.secondary.password = xxxx 
spring.datasource.secondary.driverClassName=com.mysql.jdbc.Driver 

上面是我的application.properties。然後我使用@Primary設置spring.datasource.primary作爲配置文件中的主數據庫。

@Entity 
@Table(name = "User") 
public class User { 
    @Id 
    @NotNull 
    @Column(name = "phoneid") 
    private String phoneid; 
} 
public interface UserDAO extends CrudRepository<User, String> { 
    public User findByPhoneid(String phoneid); 
} 

我想連接到數據庫spring.datasource.primary並使用表中的用戶。

@Entity 
@Table(name = "Favorite_Restaurant") 
public class FavoriteRestaurant { 
    @Id 
    @NotNull 
    @Column(name = "favorite_restaurantid") 
    private int favoriteRestaurantId; 
} 
public interface FavoriteRestaurantDAO extends JpaRepository<FavoriteRestaurant, Integer> { 

public List<FavoriteRestaurant> findAll(Sort sort); 
} 

我想連接到數據庫spring.datasource.secondary並使用表中的FavoriteRestaurant表。

但是,當我在我的服務中自動裝配UserDAo和FavoriteRestaurantDAO時,它似乎就像從主數據庫自動裝配了userdao和favoriterestaurantdao一樣。我如何從Secondary數據庫注入FavoriteRestaurantDAO !!!!!幫幫我!!!!!!

+0

請檢查此鏈接是否有幫助http://xantorohara.blogspot.in/2013/11/spring-boot-jdbc-with-multiple.html –

回答

0

爲了能夠使用多個數據源,您需要擁有多個持久單元配置。

我會假設你已經有datasourceAdatasourceB進行配置。

我們爲每個持久性單元都有一個配置類。該列表包含datasourceA的類(您將不得不復制並調整datasourceB的配置)。

不混合來自不同持久單元的實體也是一個好主意。 所以我們根據軟件包將它們分開。我們創建了一個空類 SpringRootPackageMarker,以便它告訴彈簧要掃描哪些包。

注意!SpringRootPackageMarker類在兩個@EnableJpaRepositoriesgetDatasourceAEntityManagerFactoryBean方法使用

因此,這是我們的方式如何做到這一點:

@DependsOn("transactionManager") 
@EnableJpaRepositories(
     basePackageClasses = SpringRootPackageMarker.class, 
     entityManagerFactoryRef = "datasourceAEntityManager", 
     transactionManagerRef = "transactionManager") 
public class DatasourceAPersistenceUnitConfiguration { 


    private static final String DATASOURCE_A_PERSISTENT_UNIT_NAME = "datasourceAPU"; 


    @DependsOn("transactionManager") // for unit tests 
    @Bean(name = "datasourceAEntityManager") 
    public LocalContainerEntityManagerFactoryBean getDatasourceAEntityManagerFactoryBean() { 
     final LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
     factory.setPersistenceUnitName(DATASOURCE_A_PERSISTENT_UNIT_NAME); 
     factory.setDataSource(getDatasourceA()); 
     factory.setJpaVendorAdapter(getDatasourceAJpaVendorAdapter()); 
     factory.setPackagesToScan(SpringRootPackageMarker.class.getPackage().getName()); 
     Properties jpaProperties = getDatasourceAJpaProperties(); 
     factory.setJpaProperties(jpaProperties); 
     return factory; 
    } 

    @Bean 
    public DataSource getDatasourceA() { 

     DataSource datasource = null; 
     // prepare datasource A; 

     return datasource; 
    } 


    private JpaVendorAdapter getDatasourceAJpaVendorAdapter() { 
     final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 

     //custom configuration for datasource A 

     return vendorAdapter; 
    } 


    private Properties getDatasourceAJpaProperties() { 
     Properties jpaProperties = new Properties(); 

     //custom properties 

     return jpaProperties; 
    } 
} 

} 

如果您計劃了EntityManager注入到你的應用程序,你就必須做它是這樣的:

@PersistenceContext(unitName= DatasourceAPersistenceUnitConfiguration.DATASOURCE_A_PERSISTENT_UNIT_NAME) 
private EntityManager manager; 
+0

謝謝,我終於知道發生了什麼問題! !我錯過了配置類上方的@EnableAutoConfiguration,稍後我會提出解決方案 – zjx556

0

最後,我加入我上面的配置類@EnableAutoConfiguration解決了這個問題

@Configuration 
@EnableJpaRepositories(basePackages = "datamodel.dao", entityManagerFactoryRef = "localEntityManagerFactory", transactionManagerRef = "localTransactionManager") 
@EnableTransactionManagement 
@EnableAutoConfiguration ///the key to make spring boot know your config!!!!!!!!!!!!! 
public class MainDataConfig { 
@Bean 
@ConfigurationProperties(prefix = "datasource.main") 
@Primary 
public DataSource localDataSource() { 
    return DataSourceBuilder.create().build(); 
} 

@Bean 
@Primary 
public LocalContainerEntityManagerFactoryBean localEntityManagerFactory(final EntityManagerFactoryBuilder builder) { 
    return builder.dataSource(localDataSource()).packages("datamodel.domain") 
     .persistenceUnit("mainPersistenceUnit").build(); 
} 

@Bean 
@Primary 
public JpaTransactionManager localTransactionManager(@Qualifier("localEntityManagerFactory") final EntityManagerFactory factory) { 
    return new JpaTransactionManager(factory); 
} 
} 
相關問題