您的位置:首页 > 编程语言 > Java开发

spring+jpa 两个数据源配置

2016-04-15 15:08 316 查看
1. META-INF/persistence.xml :

 

<persistence xmlns="http://java.sun.com/xml/ns/persistence"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/persistencehttp://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"

    version="1.0">

    <persistence-unit name="aaaUnit"  transaction-type="RESOURCE_LOCAL">  

     <provider>org.hibernate.ejb.HibernatePersistence</provider>

  <properties>

   <property name="hibernate.hbm2ddl.auto" value="update" />

   <property name="hibernate.jdbc.fetch_size" value="18" />

   <property name="hibernate.jdbc.batch_size" value="10" />

   <property name="hibernate.show_sql" value="false" />

   <property name="hibernate.format_sql" value="true" />

   <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>

   </properties>

    </persistence-unit>

 <!-- *********************************************** -->

    

    <persistence-unit name="bbbUnit" transaction-type="RESOURCE_LOCAL">  

     <provider>org.hibernate.ejb.HibernatePersistence</provider>

  <properties>

   <property name="hibernate.hbm2ddl.auto" value="update" />

   <property name="hibernate.jdbc.fetch_size" value="18" />

   <property name="hibernate.jdbc.batch_size" value="10" />

   <property name="hibernate.show_sql" value="false" />

   <property name="hibernate.format_sql" value="true" />

   <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>

  </properties>

    </persistence-unit>    

</persistence>

 


2.applicationContext.xml

 

<?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:aop="http://www.springframework.org/schema/aop"

    xmlns:tx="http://www.springframework.org/schema/tx"

    xsi:schemaLocation="

    http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd

    http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.0.xsd

    http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

    

 <bean id="userService" class="hr.gov.serviceImpl.userServiceImpl"/>    

    

    

    

    <!-- ******************************************************** -->

   

   

 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

    <property name="driverClass" value="com.mysql.jdbc.Driver" />

   <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/aaa?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=round" />

    <property name="user" value="" />

    <property name="password" value=""/>

    <property name="minPoolSize" value="1" />

    <property name="maxPoolSize" value="20"/>  

    <property name="initialPoolSize" value="1"/>

    <property name="maxIdleTime" value="25000"/>

    <property name="acquireIncrement" value="1"/>

    <property name="acquireRetryAttempts" value="30"/>

    <property name="acquireRetryDelay" value="1000"/>

    <property name="testConnectionOnCheckin" value="true"/>

    <property name="automaticTestTable" value="c3p0TestTable"/>

    <property name="idleConnectionTestPeriod" value="18000"/>

    <property name="checkoutTimeout" value="3000"/>

 </bean>

 

 <bean id="entityManagerFactory" autowire="byName"

        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

        <property name="persistenceUnitName" value="aaaUnit" />

        <property name="dataSource" ref="dataSource" />

        <property name="jpaVendorAdapter">

            <bean

                class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">

                <property name="database" value="MYSQL" />

                <property name="showSql" value="false" />

            </bean>

        </property>

    </bean>

 

  <!-- 事务管理 -->

  <bean id="transactionManager"

   class="org.springframework.orm.jpa.JpaTransactionManager">

   <property name="entityManagerFactory"  ref="entityManagerFactory" />

  </bean>

 

  <!-- 将事务管理加到标有 @Transactional 的类或者方法上 -->

  <tx:annotation-driven transaction-manager="transactionManager" />

 

<!-- ********************************************************* -->

 

 <bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

    <property name="driverClass" value="com.mysql.jdbc.Driver" />

    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/bbb?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=round" />

    <property name="user" value="" />

    <property name="password" value="" />

    <property name="minPoolSize" value="1" />

    <property name="maxPoolSize" value="20"/>  

    <property name="initialPoolSize" value="1"/>

    <property name="maxIdleTime" value="25000"/>

    <property name="acquireIncrement" value="1"/>

    <property nam
df14
e="acquireRetryAttempts" value="30"/>

    <property name="acquireRetryDelay" value="1000"/>

    <property name="testConnectionOnCheckin" value="true"/>

    <property name="automaticTestTable" value="c3p0TestTable"/>

    <property name="idleConnectionTestPeriod" value="18000"/>

    <property name="checkoutTimeout" value="3000"/>

   

 </bean>

 

  <bean id="entityManagerFactory2" autowire="byName"

        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

        <property name="persistenceUnitName" value="bbbUnit" />

        <property name="dataSource" ref="dataSource2" />

        <property name="jpaVendorAdapter">

            <bean

                class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">

                <property name="database" value="MYSQL" />

                <property name="showSql" value="false" />

            </bean>

        </property>

    </bean>

  <!-- 事务管理 -->

  <bean id="transactionManager2"

   class="org.springframework.orm.jpa.JpaTransactionManager">

   <property name="entityManagerFactory"  ref="entityManagerFactory2" />

   

  </bean>

 

  <!-- 将事务管理加到标有 @Transactional 的类或者方法上 -->

  <tx:annotation-driven transaction-manager="govtransactionManager2" />

  

  

 

</beans>

 

3. dao注解管理事务

建立两个baseDaoImpl:

public EntityManager entityManager;

 

 private EntityManagerFactory emf;

 public EntityManager getEntityManager() {

  return entityManager;

 }

 

 @PersistenceContext(unitName="aaaUnit")

 public void setEntityManager(EntityManager entityManager) {

  this.entityManager = entityManager;

 }

 @PersistenceUnit(unitName="aaaUnit")

 public void setEntityManagerFactory(EntityManagerFactory emf) {

  this.emf = emf;

 }

 

baseDaoImpl2:

public EntityManager entityManager;

 

 private EntityManagerFactory emf;

 public EntityManager getEntityManager() {

  return entityManager;

 }

 

 @PersistenceContext(unitName="aaaUnit")

 public void setEntityManager(EntityManager entityManager) {

  this.entityManager = entityManager;

 }

 @PersistenceUnit(unitName="aaaUnit")

 public void setEntityManagerFactory(EntityManagerFactory emf) {

  this.emf = emf;

 }

用两个dao分开链接数据库。

实现类继承basedao或basedao2即可。

 

补充:service添加事务工厂,则需要改变一些配置。

1.两个数据库对应的事务各添加一句   <qualifier value="aaaEM" /> 

例如:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">

   <property name="entityManagerFactory"  ref="entityManagerFactory" />

   <qualifier value="aaaEM" /> 

  </bean>

2. 添加之后,会提示出错,不支持qualifier 。

则将applicationContext.xml的头部更改为:

<?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:tx="http://www.springframework.org/schema/tx"

    xsi:schemaLocation="http://www.springframework.org/schema/beans 

            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  

            http://www.springframework.org/schema/tx 

            http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">



到此完成。

 

配置过程中遇到的问题

配置完成后,启动项目应该达到自动建立数据库的效果。

控制台打印错误:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 2

如果认真观察的话,上面应该还会提示在创建哪个bean的时候提示出错。

那么提示错误的bean里面应该有用到EntityManagerFactory。

解决办法:对set方法添加注解,如:

@PersistenceUnit(unitName="aaaUnit")

 public void setEntityManagerFactory(EntityManagerFactory emf) {

  this.emf = emf;

 }

这样来区分数据源。

重启,ok。

 

参考文章:http://my.oschina.net/frankly/blog/27702
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: