繁体   English   中英

JPA Hibernate Spring MySql Tomcat-连接到2个数据库

[英]JPA Hibernate Spring MySql Tomcat - Connect to 2 databases

我已经搜索,阅读,尝试了2天的代码,但没有成功。

我需要能够使用标题中列出的技术连接到2个不同的数据库,而不必同时连接到2个数据库。 我使用的是Tomcat7,而不是J2EE容器。

以下是我对应用程序上下文的了解。 对于一个数据库,它工作正常。 我需要怎么做才能配置两个? 我如何告诉我的DAO使用哪个连接? 提前致谢。

<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:tx="http://www.springframework.org/schema/tx"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.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-4.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">


<tx:annotation-driven/>
<context:component-scan base-package="org.aaa.slds"/>
<context:property-placeholder location="classpath:db.properties" />

<bean id="dataSourceWCCC" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="username" value="${dbuser_wccc}"/>
    <property name="password" value="${dbpassword_wccc}"/>
    <property name="url" value="${dburl_wccc}"/>
    <property name="driverClassName" value="${dbdriver_wccc}"/>
</bean>

    <bean id="dataSourceDWS" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="username" value="${dbuser_dws}"/>
    <property name="password" value="${dbpassword_dws}"/>
    <property name="url" value="${dburl_dws}"/>
    <property name="driverClassName" value="${dbdriver_dws}"/>
</bean>

<bean id="entityManagerFactoryWCCC" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSourceWCCC"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    </property>
    <property name="jpaProperties">
        <map>
            <entry key="hibernate.hbm2ddl.auto" value="create-drop"/>
            <entry key="hibernate.show_sql" value="false"/>
        </map>
    </property>
    <property name="packagesToScan" value="org.aaa.slds.core.models.entities.wccc"/>
</bean>

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

一旦添加第二个EntityManager,我就会获得运行时errpr ////信息:HHH000204:处理PersistenceUnitInfo [名称:punit2 ...] 2015年5月18日,下午1:1.22:org.apache.catalina.core.StandardContext startInternal严重:错误listenerStart

这是我完整的appcontext文件...

<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:tx="http://www.springframework.org/schema/tx"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.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-4.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">

<context:property-placeholder location="classpath:db.properties"/>

<!-- Enable AspectJ style of Spring AOP -->
<aop:aspectj-autoproxy/>

<context:annotation-config/>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
<context:component-scan base-package="gov.wyo.slds"/>

<!-- Configure Aspect Beans, without this Aspects advices won't execute
<bean name="loggingAspect" class="LoggingAspect" />  -->

<bean id="dataSourceWCCC" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="username" value="${wccc.dbuser}"/>
    <property name="password" value="${wccc.dbpassword}"/>
    <property name="url" value="${wccc.dburl}"/>
    <property name="driverClassName" value="${wccc.dbdriver}"/>
</bean>

<bean id="entityManagerFactoryWCCC" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="punit"/>

    <property name="dataSource" ref="dataSourceWCCC"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="false"/>
        </bean>
    </property>
    <property name="jpaPropertyMap">
        <map>
            <entry key="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
            <entry key="hibernate.hbm2ddl.auto" value="update"/>
            <entry key="hibernate.format_sql" value="true"/>
        </map>
    </property>
    <property name="packagesToScan" value="gov.wyo.slds.core.models.entities.wccc"/>
</bean>
<bean id="dataSourceDWS" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="username" value="${dws.dbuser}"/>
    <property name="password" value="${dws.dbpassword}"/>
    <property name="url" value="${dws.dburl}"/>
    <property name="driverClassName" value="${dws.dbdriver}"/>
</bean>

<bean id="entityManagerFactoryDWS" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="punit2"/>

    <property name="dataSource" ref="dataSourceDWS"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="false"/>
        </bean>
    </property>
    <property name="jpaPropertyMap">
        <map>
            <entry key="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
            <entry key="hibernate.hbm2ddl.auto" value="create"/>
            <entry key="hibernate.format_sql" value="true"/>
        </map>
    </property>
    <property name="packagesToScan" value="gov.wyo.slds.core.models.entities.dws"/>
</bean>

<bean id="transactionManagerWCCC" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactoryWCCC" />
    <qualifier value="wccc"/>
</bean>

<bean id="transactionManagerDWS" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactoryDWS" />
    <qualifier value="dws"/>
</bean>

<tx:annotation-driven/>

<bean id="persistenceExceptionTranslationPostProcessor"
      class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

<!-- TODO: re-eanble when we have services -->
<!-- context:component-scan base-package="com.slds.core.services.impl"/>  -->

这是我的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/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.1">

<persistence-unit name="punit">
</persistence-unit>

<persistence-unit name="punit2">
</persistence-unit>

更完整的错误是

Error creating bean with name 'DWSWageControllerImpl' defined in file [/Users/sja/Development/p20w-slds-poc/target/slds-1.0-SNAPSHOT/WEB-INF/classes/gov/wyo/slds/api/controllers/impl/DWSWageControllerImpl.class] 

通过带有类型为[gov.wyo.slds.core.services.DWSWageService]的索引0的构造函数参数表示的不满意依赖关系::创建名称为'DWSWageService'的bean时出错:自动连接依赖关系的注入失败; 嵌套的异常是org.springframework.beans.factory.BeanCreationException:无法自动连线字段:私有gov.wyo.slds.core.repositories.wccc.DWSWageRepository gov.wyo.slds.core.services.impl.DWSWageServiceImpl.dwsWageRepository; 嵌套的异常是org.springframework.beans.factory.BeanCreationException:创建名称为'dwsWageRepository'的bean时出错:持久性依赖项注入失败; 嵌套的异常是org.springframework.beans.factory.NoUniqueBeanDefinitionException:没有定义类型为[javax.persistence.EntityManagerFactory]的合格Bean:

预期的单个匹配bean,但发现2:entityManagerFactoryWCCC,entityManagerFactoryDWS;

任何帮助,将不胜感激。

为此,您需要:

  1. 两个EntityManagerFactory:

     <bean id="entityManagerFactoryWCCC" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSourceWCCC"/> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> </property> <property name="jpaProperties"> <map> <entry key="hibernate.hbm2ddl.auto" value="create-drop"/> <entry key="hibernate.show_sql" value="false"/> </map> </property> <property name="packagesToScan" value="org.aaa.slds.core.models.entities.wccc"/> </bean> <bean id="entityManagerFactoryDWS" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSourceDWS"/> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> </property> <property name="jpaProperties"> <map> <entry key="hibernate.hbm2ddl.auto" value="create-drop"/> <entry key="hibernate.show_sql" value="false"/> </map> </property> <property name="packagesToScan" value="org.aaa.slds.core.models.entities.dws"/> </bean> 
  2. 两个JPA事务管理器:

     <bean id="transactionManagerWCCC" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactoryWCCC" /> <qualifier value="wccc"/> </bean> <bean id="transactionManagerDWS" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactoryDWS" /> <qualifier value="dws"/> </bean> 
  3. 并且为特定的事务管理器注释了Service方法:

     @Transactional("wccc") 

    要么

     @Transactional("dws") 

如果要在全局事务中同时注册两个数据源,则需要使用JTA事务和JTA事务管理器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM