Srping + JPA + Hibernate 多資料來源配置
專案中有配置多資料來源的需求,查了一些資料最終實現,主要參考資料:
http://www.cnblogs.com/linjiqin/archive/2011/02/12/1952904.html
https://my.oschina.net/frankly/blog/27702
我用的是spring3 + jpa2 + hibernate4,配置方式與資料中略有不同,但是都大同小異,下面說一下過程和幾個我認為的關鍵點:
1.通常jpa專案會在classpath/META-INF目錄下有個persistence.xml配置檔案,我的專案沒有這個檔案,內容直接配到spring的配置檔案裡了,以下是spring配置檔案內容:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> <!-- 使用annotation @Repository,@Service自動註冊bean, 並保證@Required、@Autowired的屬性被注入的包範圍 --> <context:component-scan base-package="com.cf" />
<!-- 資料來源1 --> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <!-- Connection Info coding --> <property name="jdbcUrl" value="jdbc:mysql://192.168.199.162:3306/cf-db?autoreconect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull"/> <property name="username" value="root"/> <property name="password" value="root"/> <property name="maximumPoolSize" value="10"/> <property name="maxLifetime" value="28700000" /> <property name="poolName" value="cf-pool0"/> </bean> <!-- Jpa Entity Manager 配置 --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/> <property name="packagesToScan"> <!-- 掃描對映類的包 --> <list> <value>com.cf.bus.core.*.domain</value> <value>com.cf.bus.additional.*.domain</value> </list> </property> <property name="jpaProperties"> <!-- 如果有persistence.xml可以配置在那裡 --> <props> <prop key="hibernate.show_sql">false</prop> <prop key="hibernate.format_sql">false</prop> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop> <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> </props> </property> <property name ="persistenceUnitName" value="unit1"/> <!-- 這個在java程式碼中注入的時候用到 ,如果有 persistence.xml也可配在那裡--> </bean> <bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> </bean> <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="allManagerMethod" expression="execution(* com..service.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" /> </aop:config> <!-- 資料來源2 --> <bean id="dataSource2" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <!-- Connection Info coding --> <property name="jdbcUrl" value="jdbc:mysql://192.168.199.162:3306/cf-rs?autoreconect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull"/> <property name="username" value="root"/> <property name="password" value="root"/> <property name="maximumPoolSize" value="10"/> <property name="maxLifetime" value="28700000" /> <property name="poolName" value="cf-pool2"/> </bean> <!-- Jpa Entity Manager 配置 --> <bean id="entityManagerFactory2" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource2"/> <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter2"/> <property name="packagesToScan"> <!-- 這裡要掃描另外的包,跟第一個資料來源的要區別開 --> <list> <value>com.cf.bus.core.rs.template.domain</value> </list> </property> <property name="jpaProperties"> <!-- 如果有persistence.xml可以配置在那裡 --> <props> <prop key="hibernate.show_sql">false</prop> <prop key="hibernate.format_sql">false</prop> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop> <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> </props> </property> <property name ="persistenceUnitName" value="unit2"/> <!-- 這裡是第二個資料來源為entityManager注入時用的 ,如果有 persistence.xml也可配在那裡 --> </bean> <bean id="hibernateJpaVendorAdapter2" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> </bean>
<!-- 由於第二個資料來源不需要對資料庫做改的操作,所以沒有配置事務 --> </beans>
兩個資料來源中有很多不同的地方,由於程式碼裡不能直接標顏色,所以只能靠自己觀察了,仔細看,spring配置完成,接下來是java程式碼。
2.在java中注入
a.資料來源1的注入
package com.cf.bus.common.dao.jpa; import org.apache.log4j.Logger; import org.hibernate.SQLQuery; import org.hibernate.transform.Transformers; import javax.annotation.Resource; import javax.persistence.*; import javax.persistence.criteria.*; import java.io.Serializable; import java.lang.reflect.Field; import java.util.*; public class BaseDaoImpl<T> implements BaseDao<T> { private static final Logger logger = Logger.getLogger(BaseDaoImpl.class); @PersistenceContext(unitName = "unit1") protected EntityManager em; @Resource(name = "entityManagerFactory") protected EntityManagerFactory emf;
..... //業務程式碼
}
b.資料來源2的注入
package com.cf.bus.core.rs.base.dao.jpa;
import org.apache.log4j.Logger;
import org.hibernate.SQLQuery;
import org.hibernate.transform.Transformers;
import javax.annotation.Resource;
import javax.persistence.*;
import javax.persistence.criteria.*;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.*;
public class BaseDaoImpl<T> implements BaseDao<T> {
private static final Logger logger = Logger.getLogger(BaseDaoImpl.class);
@PersistenceContext(unitName = "unit2")
protected EntityManager em;
@Resource(name = "entityManagerFactory2")
protected EntityManagerFactory emf;
...... //業務程式碼
}以上兩個類所在包不同,注入時引用的資料來源物件也不同,注意看。以後的dao都繼承這兩個不同的父類,就能訪問不同的資料庫了,親測可用。
由於眾所周知的原因,隱掉了一些包引用和修改了一些包名,請不要在意這些細節,並不影響本文討論的重點。
如果有問題歡迎一起交流!!
相關推薦
Srping + JPA + Hibernate 多資料來源配置
專案中有配置多資料來源的需求,查了一些資料最終實現,主要參考資料: http://www.cnblogs.com/linjiqin/archive/2011/02/12/1952904.html https://my.oschina.net/frankly/blog/277
Spring Boot的Spring-data-jpa的多資料來源配置實戰
一 新建pom <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>
Spring Boot整合Hibernate(多資料來源配置).md
配置資料來源: 定義兩個DataSource用來讀取application.properties中的不同配置: @Configuration public class DataSourceConfig { @Bean(
java hibernate多資料來源配置
這裡的value值是讀取properties檔案裡面的值,因為是多資料來源 所以value值有多個<!-- 配置資料來源 --><bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSo
Spring Boot 2.x基礎教程:Spring Data JPA的多資料來源配置
[上一篇](http://blog.didispace.com/spring-boot-learning-21-3-7/)我們介紹了在使用JdbcTemplate來做資料訪問時候的多資料來源配置實現。接下來我們繼續學習如何在使用Spring Data JPA的時候,完成多資料來源的配置和使用。 ## 新增多
springBoot+Hibernate(Jpa)多資料來源配置與使用
在學習的過程中,大多時候專案與資料庫都在本機上,使用hibernate或者mybatits加上簡單的配置就能夠打通程式到資料庫路徑,讓程式能夠訪問到資料庫。然而在一些情況下,我們不僅需要訪問本機的資料庫,還需要訪問到另外一個數據庫中的資源。本文書寫的目的便在於解
springboot2.0.5+jpa多資料來源配置
1.首先配置資料來源連線總裝類DataSourcesConfig package com.cpic.dataSources; import org.springframework.beans.factory.annotation.Qualifier; import org.springfr
Spring Boot Jpa多資料來源配置
前言隨著業務量發展,我們通常會進行資料庫拆分或是引入其他資料庫,從而我們需要配置多個數據源,如:user一個庫,business一個庫。那麼接下來我們就要考慮怎麼去在spring boot中實現多個數據源的配置。 ××× 實現建表首先是建表語句,我們要建立兩個資料庫,並各庫內新建一張表user表mysql
springboot+jpa 實現不同資料庫的多資料來源配置
廢話不多說,直接看配置! 1、application.yml # 多資料來源配置 #primary spring: primary: datasource: url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/dico_d
Spring Boot多資料來源配置(一)durid、mysql、jpa整合
目前在做一個統計專案。需要多資料來源整合,其中包括mysql和mongo。本節先講mysql、durid、jpa與spring-boot的整合。 引入Durid包 <dependency> <groupId>com.a
SpringBoot2.0 jpa多資料來源配置
隨著Springboot升級到2.0,原來1.5.x的Jpa多資料來源配置不能用了。現在總結一下Springboot2.0的jpa多資料來源配置連線池還是用druid,但是不能用druid的starter了,譬如在1.5.x時用的是<dependency>
sping4 + jpa 多資料來源配置, 多種實現
persistence-mysql.xml 及 orm-mysql.xml 的配置請參考我另外博文中 xml配置 ( 這裡是最簡單的配置方式, 後面的文章中有更智慧的配置方式) 搞外包,他們公司用到jpa,可是沒有一個人會. 真的是
springmvc+spring+jpa(hibernate)+redis+maven配置
incr 容器 adapter 事務配置 pool gravity emp exceptio package 廢話不多少 項目結構 pom.xml配置例如以下 <project xmlns="http://maven.apache.org/POM/4.0.0
Spring Boot + Jpa(Hibernate) 架構基本配置
rip exc com column valid 上傳 st3 ria root 一、maven的pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.a
spring boot的Jdbc多資料來源配置實戰
一 新建依賴 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sprin
一次多資料來源 配置問題記錄
現在的專案是個多資料來源的配置,前兩天 做專案遷移,要把另一個專案遷移到api的專案裡面。於是 貼上複製後,發現不能執行。。。 最後發現是多資料來源配置出了問題。 <?xml version="1.0" encoding="UTF-8"?
spring多資料來源配置 簡單明瞭
來源地址https://blog.csdn.net/ll535299/article/details/78203634 1.首先在config.properties檔案中配置兩個資料庫連線的基本資料。這個省略了 2.在spring配置檔案中配置這兩個資料來源:&nb
spring 手動新增 bean 到容器,例子 :多資料來源配置
package com.thunisoft.spsjsb.config.db.decrypt; import com.alibaba.druid.pool.DruidDataSource; import com.thunisoft.spsjsb.config.AppEnv; impor
實現SpringBoot的多資料來源配置
【場景】 當業務資料量達到了一定程度,DBA 需要合理配置資料庫資源。即配置主庫的機器高配置,把核心高頻的資料放在主庫上;把次要的資料放在從庫,低配置。 –(引自 https://www.cnblogs.com/Alandre/p/6611813.html 泥瓦匠BYSocket
springboot+mybatis多資料來源配置,AOP註解動態切換資料來源
轉載至:https://blog.csdn.net/xiaosheng_papa/article/details/80218006 親測有效。 注:有些系統中已經配置了單資料來源,現在要轉成多資料來源,可能需要額外的配置。拿我自己當前專案來說: 專案在啟動類中配置了單資料來源: