欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring+Jpa多數(shù)據(jù)源配置的方法示例

 更新時間:2018年08月12日 14:23:58   作者:BryantChang  
這篇文章主要介紹了spring+Jpa多數(shù)據(jù)源配置的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

今天臨下班時遇到了一個需求,我的管理平臺需要從不同的數(shù)據(jù)庫中獲取數(shù)據(jù)信息,這就需要進行Spring的多數(shù)據(jù)源配置,對于這種配置,第一次永遠都是痛苦的,不過經(jīng)歷了這次的折磨,今后肯定會對這種配置印象深刻。我們這里簡單回顧一下流程。

我們配置了兩個數(shù)據(jù)庫,一個是公司的數(shù)據(jù)庫,另一個是我本地的一個數(shù)據(jù)庫。首先是application.yml的配置(其中對于公司的數(shù)據(jù)庫我們采取了假的地址,而本機的數(shù)據(jù)庫是真是存在對應(yīng)的表和庫的)

數(shù)據(jù)庫信息:

數(shù)據(jù)表信息:

1、application.yml

datasource:
 primary:
  url: jdbc:mysql://companyurl.com:5002/db1
  username: unameq
  password: passwd1
  driver-class-name: com.mysql.jdbc.Driver
 secondary:
  url: jdbc:mysql://localhost:3306/django_test
  username: root
  password: 123456
  driver-class-name: com.mysql.jdbc.Driver
 jpa:
 database-platform: org.hibernate.dialect.MySQL5Dialect
 hibernate:
  ddl-auto: update
  show-sql: true

2、創(chuàng)建總的DataSource配置文件以及兩個Repostory的配置文件PrimaryConfig以及SecondaryConfig

DataSourceConfig

@Configuration
public class DataSourceConfig {
 @Bean(name = "primaryDataSource")
 @Qualifier("primaryDataSource")
 @ConfigurationProperties(prefix="spring.datasource.primary")//對應(yīng)的數(shù)據(jù)庫配置信息
 public DataSource primaryDataSource() {
  return DataSourceBuilder.create().build();
 }

 @Bean(name = "secondaryDataSource")
 @Qualifier("secondaryDataSource")
 @Primary
 @ConfigurationProperties(prefix="spring.datasource.secondary")
 public DataSource secondaryDataSource() {
  return DataSourceBuilder.create().build();
 }
}

PrimaryConfig

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
  entityManagerFactoryRef="entityManagerFactoryPrimary",
  transactionManagerRef="transactionManagerPrimary",
  basePackages= { "數(shù)據(jù)訪問層所在的包" }) //設(shè)置Repository所在位置
public class PrimaryConfig {

 @Autowired @Qualifier("primaryDataSource")
 private DataSource primaryDataSource;

 @Primary
 @Bean(name = "entityManagerPrimary")
 public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
  return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
 }

 @Primary
 @Bean(name = "entityManagerFactoryPrimary")
 public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {
  return builder
    .dataSource(primaryDataSource)
    .properties(getVendorProperties(primaryDataSource))
    .packages("實體類所在的包") //設(shè)置實體類所在位置
    .persistenceUnit("primaryPersistenceUnit")
    .build();
 }

 @Autowired
 private JpaProperties jpaProperties;

 private Map<String, String> getVendorProperties(DataSource dataSource) {
  return jpaProperties.getHibernateProperties(dataSource);
 }

 @Primary
 @Bean(name = "transactionManagerPrimary")
 public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
  return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
 }
}

SecondaryConfig

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
  entityManagerFactoryRef="entityManagerFactorySecondary",
  transactionManagerRef="transactionManagerSecondary",
  basePackages= { "數(shù)據(jù)訪問層所在的包" }) //設(shè)置Repository所在位置
public class SecondaryConfig {

 @Autowired
 @Qualifier("secondaryDataSource")
 private DataSource secondaryDataSource;

 @Bean(name = "entityManagerSecondary")
 public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
  return entityManagerFactorySecondary(builder).getObject().createEntityManager();
 }

 @Bean(name = "entityManagerFactorySecondary")
 public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(EntityManagerFactoryBuilder builder) {
  return builder
    .dataSource(secondaryDataSource)
    .properties(getVendorProperties(secondaryDataSource))
    .packages("實體類所在的包") //設(shè)置實體類所在位置
    .persistenceUnit("secondaryPersistenceUnit")
    .build();
 }

 @Autowired
 private JpaProperties jpaProperties;

 private Map<String, String> getVendorProperties(DataSource dataSource) {
  return jpaProperties.getHibernateProperties(dataSource);
 }

 @Bean(name = "transactionManagerSecondary")
 PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
  return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
 }
}

3、然后我對于本地數(shù)據(jù)庫新建實體類PeoplePerson

@Entity
@Table(name = "people_person")
public class PeoplePerson implements Serializable {
 @Id
 @GeneratedValue
 private Integer id;

 @Column(name = "name")
 private String name;

 @Column(name = "age")
 private Integer age;

 public PeoplePerson() {
 }

 public Integer getId() {
  return id;
 }

 public void setId(Integer id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public Integer getAge() {
  return age;
 }

 public void setAge(Integer age) {
  this.age = age;
 }

 @Override
 public String toString() {
  return "PeoplePerson{" +
    "id=" + id +
    ", name='" + name + '\'' +
    ", age=" + age +
    '}';
 }
}

并創(chuàng)建對應(yīng)的Repositoy,PeoplePersonDao并創(chuàng)建了一個findAll的方法

@Transactional@Repositorypublic interface PeoplePersonDao extends JpaRepository<PeoplePerson, Long> 
 { 
   List<PeoplePerson> findAll();
 }

4、最后,在test包中進行測試

@Autowired
private PeoplePersonDao peoplePersonDao;
@Test
public void testMultiDataSource() {
 List<PeoplePerson> list = peoplePersonDao.findAll();
 for (int i = 0; i < list.size(); i++) {
  logger.info(list.get(i).toString());
 }
}

測試結(jié)果

 一些坑

不僅僅是dao層掃描的包需要區(qū)分,對于實體類所在的包,不同的DataSource的配置中也需要區(qū)分開

對于這種套路性的東西,總結(jié)一遍是非常必要的,下次可以節(jié)省許多不必要的時間,對于內(nèi)部原理,我將在完成對Ioc和Aop分析后反過來分析其原理。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springMVC如何對輸入數(shù)據(jù)校驗實現(xiàn)代碼

    springMVC如何對輸入數(shù)據(jù)校驗實現(xiàn)代碼

    數(shù)據(jù)的校驗是交互式網(wǎng)站一個不可或缺的功能,數(shù)據(jù)驗證分為客戶端驗證和服務(wù)器端驗證,這篇文章主要介紹了springMVC如何對輸入數(shù)據(jù)校驗,需要的朋友可以參考下
    2020-10-10
  • Java項目命名規(guī)范參考

    Java項目命名規(guī)范參考

    在實際項目開發(fā)中,命名規(guī)范的遵守可以提高代碼的可讀性和可維護性,本文就來介紹一下Java項目命名規(guī)范參考,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Java8語法糖之Lambda表達式的深入講解

    Java8語法糖之Lambda表達式的深入講解

    這篇文章主要給大家介紹了關(guān)于Java8語法糖之Lambda表達式的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Java的jps命令簡介及使用示例詳解

    Java的jps命令簡介及使用示例詳解

    jps是jdk提供的一個查看當(dāng)前java進程的小工具,?可以看做是JavaVirtual?Machine?Process?Status?Tool的縮寫,非常簡單實用,本文重點給大家介紹下Java的jps命令使用,感興趣的朋友一起看看吧
    2022-03-03
  • Java虛擬機JVM棧溢出的問題解決

    Java虛擬機JVM棧溢出的問題解決

    Java虛擬機棧溢出是指在Java程序中,當(dāng)線程調(diào)用的方法層級過深,導(dǎo)致??臻g溢出的情況,本文就詳細的介紹了下產(chǎn)生的原因以及優(yōu)化,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • java如何獲得redis所有的key-value

    java如何獲得redis所有的key-value

    這篇文章主要介紹了java如何獲得redis所有的key-value,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java通俗易懂系列設(shè)計模式之策略模式

    Java通俗易懂系列設(shè)計模式之策略模式

    這篇文章主要介紹了Java通俗易懂系列設(shè)計模式之策略模式,對設(shè)計模式感興趣的同學(xué),一定要看一下
    2021-04-04
  • java中ThreadLocal的應(yīng)用場景實例分析

    java中ThreadLocal的應(yīng)用場景實例分析

    在本篇文章里小編給大家整理的是一篇關(guān)于java中ThreadLocal的應(yīng)用場景實例分析,對此有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-02-02
  • 關(guān)于MyBatis中映射對象關(guān)系的舉例

    關(guān)于MyBatis中映射對象關(guān)系的舉例

    這篇文章主要介紹了關(guān)于MyBatis中映射對象關(guān)系的舉例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Spring Boot配置Swagger的實現(xiàn)代碼

    Spring Boot配置Swagger的實現(xiàn)代碼

    這篇文章主要介紹了Spring Boot配置Swagger的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12

最新評論