最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

數(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配置文件以及兩個(gè)Repostory的配置文件PrimaryConfig以及SecondaryConfig

DataSourceConfig

@Configuration
public class DataSourceConfig {
 @Bean(name = "primaryDataSource")
 @Qualifier("primaryDataSource")
 @ConfigurationProperties(prefix="spring.datasource.primary")//對(duì)應(yīng)的數(shù)據(jù)庫(kù)配置信息
 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ù)訪問(wèn)層所在的包" }) //設(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í)體類所在的包") //設(shè)置實(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ù)訪問(wèn)層所在的包" }) //設(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í)體類所在的包") //設(shè)置實(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、然后我對(duì)于本地?cái)?shù)據(jù)庫(kù)新建實(shí)體類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)建對(duì)應(yīng)的Repositoy,PeoplePersonDao并創(chuàng)建了一個(gè)findAll的方法

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

4、最后,在test包中進(jìn)行測(cè)試

@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());
 }
}

測(cè)試結(jié)果

 一些坑

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

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

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

相關(guān)文章

  • 分享15款Java程序員必備的開(kāi)發(fā)工具

    分享15款Java程序員必備的開(kāi)發(fā)工具

    這篇文章主要介紹了分享15款Java程序員必備的開(kāi)發(fā)工具,需要的朋友可以參考下
    2015-02-02
  • idea遠(yuǎn)程Debug部署在服務(wù)器上的服務(wù)

    idea遠(yuǎn)程Debug部署在服務(wù)器上的服務(wù)

    在開(kāi)發(fā)的時(shí)候我們通常在本地代碼上debug程序,但是服務(wù)部署到了開(kāi)發(fā)環(huán)境服務(wù)器上,如何遠(yuǎn)程調(diào)試,本文主要介紹了idea遠(yuǎn)程Debug部署在服務(wù)器上的服務(wù),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Java使用StampedLock實(shí)現(xiàn)高效讀寫(xiě)功能

    Java使用StampedLock實(shí)現(xiàn)高效讀寫(xiě)功能

    StampedLock 是 Java 8 引入的高性能鎖,提供了三種鎖模式:寫(xiě)鎖、悲觀讀鎖和樂(lè)觀讀鎖,與傳統(tǒng)的 ReentrantReadWriteLock 相比,StampedLock 更注重性能,特別適合讀多寫(xiě)少的場(chǎng)景,所以本文給大家介紹了Java使用StampedLock實(shí)現(xiàn)高效讀寫(xiě)功能,需要的朋友可以參考下
    2025-01-01
  • java阻塞隊(duì)列實(shí)現(xiàn)原理及實(shí)例解析

    java阻塞隊(duì)列實(shí)現(xiàn)原理及實(shí)例解析

    這篇文章主要介紹了java阻塞隊(duì)列實(shí)現(xiàn)原理及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java向上轉(zhuǎn)型和向下轉(zhuǎn)型實(shí)例解析

    Java向上轉(zhuǎn)型和向下轉(zhuǎn)型實(shí)例解析

    這篇文章主要介紹了Java向上轉(zhuǎn)型和向下轉(zhuǎn)型實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 詳細(xì)分析JVM類加載機(jī)制

    詳細(xì)分析JVM類加載機(jī)制

    JVM將class文件字節(jié)碼文件加載到內(nèi)存中,?并將這些靜態(tài)數(shù)據(jù)轉(zhuǎn)換成方法區(qū)中的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu),在堆(并不一定在堆中,HotSpot在方法區(qū)中)中生成一個(gè)代表這個(gè)類的java.lang.Class?對(duì)象,作為方法區(qū)類數(shù)據(jù)的訪問(wèn)入口,接下來(lái)將詳細(xì)講解JVM類加載機(jī)制
    2022-04-04
  • java基于quasar實(shí)現(xiàn)協(xié)程池的方法示例

    java基于quasar實(shí)現(xiàn)協(xié)程池的方法示例

    本文主要介紹了java基于quasar實(shí)現(xiàn)協(xié)程池的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2022-06-06
  • 簡(jiǎn)單聊聊Java中驗(yàn)證碼功能的實(shí)現(xiàn)

    簡(jiǎn)單聊聊Java中驗(yàn)證碼功能的實(shí)現(xiàn)

    相信大家都經(jīng)常接觸到驗(yàn)證碼的,畢竟平時(shí)上網(wǎng)也能遇到各種驗(yàn)證碼,需要我們輸入驗(yàn)證碼進(jìn)行驗(yàn)證我們是人類,本篇文章就從這幾個(gè)方面出發(fā)說(shuō)說(shuō)驗(yàn)證碼,廢話不多說(shuō),下面開(kāi)始正文
    2023-06-06
  • Spring Boot利用@Async異步調(diào)用:使用Future及定義超時(shí)詳解

    Spring Boot利用@Async異步調(diào)用:使用Future及定義超時(shí)詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot利用@Async異步調(diào)用:使用Future及定義超時(shí)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2018-05-05
  • Java中將bean放入Spring容器中的幾種方式詳解

    Java中將bean放入Spring容器中的幾種方式詳解

    這篇文章主要介紹了Java中將bean放入Spring容器中的幾種方式詳解,在Spring框架中,有多種方式可以將Bean(即對(duì)象)放入Spring容器中,今天我們就來(lái)詳細(xì)說(shuō)一下這幾種方式,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

江都市| 怀集县| 拉萨市| 陆丰市| 忻城县| 卢龙县| 屏南县| 吉隆县| 鄂尔多斯市| 仁化县| 陇南市| 新晃| 无为县| 洪江市| 类乌齐县| 东港市| 安图县| 灌云县| 林甸县| 沭阳县| 张家川| 库车县| 阿克苏市| 晋州市| 博湖县| 寻乌县| 利辛县| 秦安县| 儋州市| 深州市| 屏东市| 吴旗县| 隆昌县| 金寨县| 阳西县| 灵武市| 织金县| 滨州市| 滦平县| 九江县| 特克斯县|