2016-03-04 4 views
2

Я столкнулся с проблемой, когда я хотел работать между двумя базами данных, я хотел использовать таблицу 1 в базе данных 1 и таблицу 2 в базе данных 2, я пробовал так много способов, но все, кажется, не Работа.Использование нескольких баз данных весной загрузки

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 

приведено выше мое приложение.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 и использовать таблицу User в ней.

@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 из первичной базы данных. Как я могу добавить FavoriteRestaurantDAO из вторичной базы данных !!!!! Помогите!!!!!!

+0

Пожалуйста, проверьте эту ссылку, чтобы узнать, помогает ли она http://xantorohara.blogspot.in/2013/11/spring-boot-jdbc-with-multiple.html –

ответ

0

Для использования нескольких источников данных необходимо иметь несколько постоянных конфигураций устройств.

Предполагаю, что у вас есть datasourceA и datasourceB для настройки.

У нас есть один класс конфигурации для каждого из наших постоянных блоков. В листинге содержится класс для datasourceA (вам придется скопировать и настроить конфигурацию для datasourceB).

Это также хорошая идея не смешивать сущности из разных постоянных единиц. Итак, мы разделили их на основе пакета. Мы создали пустой класс SpringRootPackageMarker, чтобы он сообщал весне, какие пакеты сканировать.

Примечание!SpringRootPackageMarker класс используется как в @EnableJpaRepositories и в getDatasourceAEntityManagerFactoryBean методе

Так что это наш способ, как это сделать:

@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); 
} 
} 
Смежные вопросы