sping4 + jpa 多数据源配置, 多种实现

  • persistence-mysql.xml   及   orm-mysql.xml 的配置请参考我另外博文中 xml配置

   ( 这里是最简单的配置方式,    后面的文章中有更智能的配置方式)

   

         搞外包,他们公司用到jpa,可是没有一个人会. 真的是坑爹的一笔. 好歹让我弄出来了.  下面是配置代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xmlns:repository="http://www.springframework.org/schema/data/repository"
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="http://www.springframework.org/schema/data/repository http://www.springframework.org/schema/data/repository/spring-repository-1.5.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">

	<!--没有配置在IOC里的类进行set方法上面  Autowired的注入  -->
	<context:spring-configured />
	

  

<bean id="dataSource" class="cn.com.taiji.util.DynamicDataSource">
		<property name="targetDataSources">
			<map key-type="java.lang.String">
				<entry key="dataSource1" value-ref="dataSource1" />
				<entry key="dataSource2" value-ref="dataSource2" />
			</map>
		</property>
		<property name="defaultTargetDataSource" ref="dataSource1" />
	</bean>

	<bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource"
		 destroy-method="close">
		<property name="url" value="jdbc:mysql://localhost/yw_taiji?useUnicode=true&characterEncoding=utf-8" />
			<property name="username" value="root" />
			<property name="password" value="" />
		<property name="maxActive" value="20" />
		<property name="initialSize" value="1" />
		<property name="maxWait" value="60000" />
		<property name="minIdle" value="1" />
		<property name="timeBetweenEvictionRunsMillis" value="60000" />
		<property name="minEvictableIdleTimeMillis" value="300000" />
		<property name="validationQuery" value="SELECT 'x'" />
		<property name="testWhileIdle" value="true" />
		<property name="testOnBorrow" value="false" />
		<property name="testOnReturn" value="false" />
		<property name="poolPreparedStatements" value="true" />
		<property name="maxPoolPreparedStatementPerConnectionSize"
			value="20" />
	</bean>
	<bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource"
		 destroy-method="close">
		<property name="url" value="jdbc:mysql://localhost/taiji?useUnicode=true&characterEncoding=utf-8" />
			<property name="username" value="root" />
			<property name="password" value="" />
		<property name="maxActive" value="20" />
		<property name="initialSize" value="1" />
		<property name="maxWait" value="60000" />
		<property name="minIdle" value="1" />
		<property name="timeBetweenEvictionRunsMillis" value="60000" />
		<property name="minEvictableIdleTimeMillis" value="300000" />
		<property name="validationQuery" value="SELECT 'x'" />
		<property name="testWhileIdle" value="true" />
		<property name="testOnBorrow" value="false" />
		<property name="testOnReturn" value="false" />
		<property name="poolPreparedStatements" value="true" />
		<property name="maxPoolPreparedStatementPerConnectionSize"
			value="20" />
	</bean>

 

		<!-- JDBC配置 -->
		<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
			<property name="dataSource">
				<ref bean="dataSource" />
			</property>
		</bean>
	
	<!-- ***************************************数据源1*****************************************************-->		
	
		<!--允许使用注解方式配置事务 -->  
		<tx:annotation-driven transaction-manager="transactionManager" />

	    <!--service端使用inject方式查询扫描 --> <!-- 数据源1的实体放在db1包路径下 -->
		<jpa:repositories base-package="cn.com.king.repository.db1"
		 			 entity-manager-factory-ref="entityManagerFactory"
								transaction-manager-ref="transactionManager">
		</jpa:repositories>
		
		 <!-- JPA 事务管理 --> 
		<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
			<property name="dataSource" ref="dataSource1" /> 
			<property name="entityManagerFactory" ref="entityManagerFactory" />
			<qualifier value="dataSource1EM"/> 
		</bean>
		<!-- JPA 实体管理工厂 --> 
		<bean id="entityManagerFactory"
				class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
				<property name="dataSource" ref="dataSource1" />
				<!-- 对应存放db2的配置   及  表实体 -->
				<property name="persistenceXmlLocation" value="classpath:META-INF/persistence-mysql.xml" />
				<!-- 必须  -->
				<property name="persistenceUnitName" value="db1"></property>
		</bean>
		
<!-- *******************************************数据源2****************************************************** -->		
		<tx:annotation-driven transaction-manager="transactionManager2" />
										 <!-- 数据源2的实体放在db2包路径下 -->
		<jpa:repositories base-package="cn.com.king.repository.db2"  
					entity-manager-factory-ref="entityManagerFactory2"
								transaction-manager-ref="transactionManager2"/>
		
		
		<bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager">
			<property name="dataSource" ref="dataSource2" /> 
			<property name="entityManagerFactory" ref="entityManagerFactory2" />
			<qualifier value="dataSource2EM"/> 
		</bean>
		
		<bean id="entityManagerFactory2"
				class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
				<property name="dataSource" ref="dataSource2" />
				<property name="persistenceXmlLocation" value="classpath:META-INF/persistence-mysql2.xml" /> 
				<!-- 必须  -->
				<property name="persistenceUnitName" value="db2"></property>
		</bean>

 

下面事例下多种写法

 

 第一种  (unitName="db1")  对应上面配置中 <property name="persistenceUnitName" value="db2"></property>  而他对应与  
          persistence-mysql2.xml中的 <persistence-unit name="db1" transaction-type="RESOURCE_LOCAL">
         当配置了多数据源的情况下  这个不能省略,  单数据源可以不写
	@PersistenceContext(unitName="db1")  
private EntityManager em;
                                                         
                                                         
很多情况下 这种写法只能使用第一个数据源, 那是由于你
                    <jpa:repositories base-package="cn.com.king.repository.db2"  扫描包的时候都扫描到了,
	并且mysql2.xml  里面和 mysql.xml 都是一样的实体, 这里注意要分别对应上就行,  我开始这里就没有mysql2.xml
全部用的mysql.xml而且都写这里面,总报找不到表的错误
@InjectMonitorRepository monitorRepository;


  上面2个获取到dao层的方法,  至于使用可以 参考 这个里面的讲的很好

   jpa的查询方式   

  这里有个方法,  em.createNativeQuery(sqlString);  可以直接写sql查询,   这样在多表查询的情况下非常适用, 纯sql写法,  但是在分页上还是用的jpa, 自动封装 limit或者 rowNum

     这个 取决于 persistence-mysql2.xml 中 <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> 你使用的数据库方言自动转换

 

  jpa查询的时候别忘了加注解

@Transactional
public interface LogZJTaskInfoRepository  extends JpaRepository<LogZJTaskInfo, String>, JpaSpecificationExecutor<LogZJTaskInfo>{


}

 这里如果没有注解 在modify操作的时候  会有空指针异常

 相关@modify注解同理,  这个问题刚使用的时候困扰了好久,哎,公司用这个框架尽然没有一个人写个crud的例子出来就随便让用, 遇到问题都只能自己百度摸索.

百度的多数据源配置大多都是spring3的  在4这里根本用不了.好了   配置如上,  可以先写个单一数据源的jpa  进行crud后,  然后使用如上配置就能轻松改为多数据源了.

      祝大家好运!!!!!!!!!!!!!!!!!!!!!!

 

 


 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值