1. 程式人生 > >Srping + JPA + Hibernate 多資料來源配置

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 親測有效。 注:有些系統中已經配置了單資料來源,現在要轉成多資料來源,可能需要額外的配置。拿我自己當前專案來說: 專案在啟動類中配置了單資料來源: