【问题标题】:Multiple database with Spring+Hibernate+JPASpring+Hibernate+JPA的多数据库
【发布时间】:2010-12-26 13:21:33
【问题描述】:

我正在尝试配置 Spring+Hibernate+JPA 以使用两个数据库(MySQL 和 MSSQL)。

我的数据源-context.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"
 xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
  http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd"
 xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:util="http://www.springframework.org/schema/util">

 <!--
 Data Source config 
  -->
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
  destroy-method="close" p:driverClassName="${local.jdbc.driver}" p:url="${local.jdbc.url}"
  p:username="${local.jdbc.username}" p:password="${local.jdbc.password}">
 </bean>

 <bean id="dataSourceRemote" class="org.apache.commons.dbcp.BasicDataSource"
  destroy-method="close" p:driverClassName="${remote.jdbc.driver}"
  p:url="${remote.jdbc.url}" p:username="${remote.jdbc.username}"
  p:password="${remote.jdbc.password}" />

 <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
  p:entity-manager-factory-ref="entityManagerFactory" />

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

 <bean id="persistenceUnitManager"
  class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
        <property name="persistenceXmlLocations">
   <list value-type="java.lang.String">
    <value>classpath*:config/persistence.local.xml</value>
    <value>classpath*:config/persistence.remote.xml</value>
   </list>
  </property>

  <property name="dataSources">
   <map>
    <entry key="localDataSource" value-ref="dataSource" />
    <entry key="remoteDataSource" value-ref="dataSourceRemote" />
   </map>
  </property>
  <property name="defaultDataSource" ref="dataSource" />
 </bean>

 <bean id="entityManagerFactory"
  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="jpaVendorAdapter">
   <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
    p:showSql="true" p:generateDdl="true">
   </bean>
  </property>
  <property name="persistenceUnitManager" ref="persistenceUnitManager" />
<property name="persistenceUnitName" value="localjpa"/>
 </bean>

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

</beans>

每个persistence.xml 包含一个单元,如下所示:

<persistence-unit name="remote" transaction-type="RESOURCE_LOCAL">
  <properties>
   <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.DefaultNamingStrategy" />
   <property name="hibernate.dialect" value="${remote.hibernate.dialect}" />
   <property name="hibernate.hbm2ddl.auto" value="${remote.hibernate.hbm2ddl.auto}" />
  </properties>
 </persistence-unit>

PersistenceUnitManager 导致以下异常:

无法解析对 bean 的引用 设置时的“persistenceUnitManager” 豆属性 'persistenceUnitManager';嵌套的 例外是 org.springframework.beans.factory.BeanCreationException: 创建具有名称的 bean 时出错 'persistenceUnitManager' 定义在 类路径资源 [配置/数据源上下文.xml]: bean初始化失败;嵌套的 例外是 org.springframework.beans.TypeMismatchException: 未能转换的属性值 键入 [java.util.ArrayList] 为必需 为属性键入 [java.lang.String] 'persistenceXmlLocation';嵌套的 例外是 java.lang.IllegalArgumentException: 无法转换类型的值 [java.util.ArrayList] 到所需类型 [java.lang.String] 用于属性 'persistenceXmlLocation':没有匹配 找到编辑器或转换策略

如果只留下一个没有列表的 persistence.xml,每个都可以正常工作 但我需要 2 个单位...

我还尝试找到在 Spring+Hibernate 上下文中使用两个数据库的替代解决方案,因此我将不胜感激。

改成persistenceXmlLocations后出现新错误:

在 {classpath:config/persistence.local.xml, classpath:config/persistence.remote.xml} 中没有定义单个默认持久性单元

更新:

我添加了 persistenceUnitName,它可以工作,但只有一个单元,仍然需要帮助。

更新:

我更改了配置文件: 数据源-context.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"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util">

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close" p:driverClassName="${local.jdbc.driver}" p:url="${local.jdbc.url}"
        p:username="${local.jdbc.username}" p:password="${local.jdbc.password}">
    </bean>

    <bean id="dataSourceRemote" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close" p:driverClassName="${remote.jdbc.driver}"
        p:url="${remote.jdbc.url}" p:username="${remote.jdbc.username}"
        p:password="${remote.jdbc.password}">
    </bean>

    <bean
        class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor">
        <property name="defaultPersistenceUnitName" value="pu1" />
    </bean>

    <bean id="persistenceUnitManager"
        class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
        <property name="persistenceXmlLocation" value="${persistence.xml.location}" />
        <property name="defaultDataSource" ref="dataSource" /> <!-- problem -->
        <property name="dataSources">
            <map>
                <entry key="local" value-ref="dataSource" />
                <entry key="remote" value-ref="dataSourceRemote" />
            </map>
        </property>
    </bean>

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
                p:showSql="true" p:generateDdl="true">
            </bean>
        </property>
        <property name="persistenceUnitManager" ref="persistenceUnitManager" />
        <property name="persistenceUnitName" value="pu1" />
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="entityManagerFactoryRemote"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
                p:showSql="true" p:generateDdl="true">
            </bean>
        </property>
        <property name="persistenceUnitManager" ref="persistenceUnitManager" />
        <property name="persistenceUnitName" value="pu2" />
        <property name="dataSource" ref="dataSourceRemote" />
    </bean>

    <tx:annotation-driven />

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
        p:entity-manager-factory-ref="entityManagerFactory" />


    <bean id="transactionManagerRemote" class="org.springframework.orm.jpa.JpaTransactionManager"
        p:entity-manager-factory-ref="entityManagerFactoryRemote" />

</beans>

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<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_1_0.xsd"
    version="1.0">

    <persistence-unit name="pu1" transaction-type="RESOURCE_LOCAL">
        <properties>
            <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.DefaultNamingStrategy" />
            <property name="hibernate.dialect" value="${local.hibernate.dialect}" />
            <property name="hibernate.hbm2ddl.auto" value="${local.hibernate.hbm2ddl.auto}" />                          
        </properties>
    </persistence-unit>

    <persistence-unit name="pu2" transaction-type="RESOURCE_LOCAL">
        <properties>
            <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.DefaultNamingStrategy" />
            <property name="hibernate.dialect" value="${remote.hibernate.dialect}" />
            <property name="hibernate.hbm2ddl.auto" value="${remote.hibernate.hbm2ddl.auto}" />
        </properties>
    </persistence-unit>

</persistence>

现在它构建了两个 entityManagerFactory,但都是用于 Microsoft SQL Server

[main] INFO org.hibernate.ejb.Ejb3Configuration - Processing PersistenceUnitInfo [
    name: pu1
    ...]
[main] INFO org.hibernate.cfg.SettingsFactory - RDBMS: Microsoft SQL Server

[main] INFO org.hibernate.ejb.Ejb3Configuration - Processing PersistenceUnitInfo [
    name: pu2
    ...]
[main] INFO org.hibernate.cfg.SettingsFactory - RDBMS: Microsoft SQL Server (but must MySQL)

我建议,仅使用 dataSource,dataSourceRemote(无替换)是行不通的。这是我的最后一个问题。

【问题讨论】:

    标签: java spring hibernate jpa multi-database


    【解决方案1】:

    您需要使用persistenceXmlLocations 属性(注意复数)而不是persistenceXmlLocation。它是一个字符串数组,所以它会从列表中自动转换:

    <bean id="persistenceUnitManager"
          class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
      <property name="persistenceXmlLocations"><list>
        <value>classpath*:config/persistence.local.xml</value>
        <value>classpath*:config/persistence.remote.xml</value>
      </list></property>
      ...
    

    更新(基于编辑)

    您的 entityManagerFactory 未指定 persistenceUnitName 属性。您必须明确地这样做,因为您定义了多个持久性单元,entityManagerFactory 必须知道要使用哪一个。

    【讨论】:

    • 如果和这个有关,也许你可以更新你的问题,我来看看。如果没有直接相关,最好发布一个新问题。
    • 好的,所以如果我明确设置persistenceUnitName,它会起作用,但只能使用一个单元。如何在应用程序中切换单位?
    • 您不能“切换”它们。但是,您可以创建多个 entityManagerFactory 实例 - 每个持久性单元一个。然后,您可以在代码中的 PersistenceContext 注释上指定 unitName,以选择哪个工厂将生成将被注入的实体管理器。
    • 大家好,我阅读了上面的代码,因此创建多个 org.springframework.orm.jpa.JpaTransactionManager 并使用 @transactional("name") 是合法的?
    【解决方案2】:

    贾斯汀,3 号可以用更标准的方式完成,如下所示:

    1. 在您的 Spring 上下文中:

      <context:annotation-config />
      
    2. 在 Spring 管理的 DAO 中(注意 unitName 属性):

      @PersistenceContext(unitName = "pu1"`) protected EntityManager entityManager;
      

    这样,与名为“pu1”的持久性单元相对应的正确实例化的 EntityManager 将被注入相应的 DAO。

    【讨论】:

    • 我不相信 Spring 支持版本 3 之前的 unitName 属性,仅供参考。
    【解决方案3】:

    如果您遵循本教程, http://www.javacodegeeks.com/2010/05/jboss-42x-spring-3-jpa-hibernate.html您可以进行以下更改以访问两个不同的数据库:

    1. persistence.xml,为您的第二个数据库定义第二个持久性单元。
    2. spring.xml,以不同的名称定义第二个 entityManagerFactory bean,让我们说“entityManagerFactoryDB2”并将其配置为使用第二个数据库的持久单元。
    3. 对于您要访问第二个数据库的每个 DAO,包括以下内容:

      @Autowired
      private EntityManagerFactory entityManagerFactoryDB2;
      
      @PostConstruct
      public void init() {
          super.setEntityManagerFactory(entityManagerFactoryDB2);
      }
      

    就是这样!

    在 Spring 服务类上,照常使用 DAO!

    【讨论】:

      【解决方案4】:

      我通过这种方式解决了问题(如何使用spring和Hibernate连接多个数据库),希望对您有所帮助:) 注意: 我已经添加了相关代码,请在下面提到的代码中使用的 impl 的帮助下制作 dao。

      **web.xml**
      
      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
          id="WebApp_ID" version="3.0">
          <display-name>MultipleDatabaseConnectivityInSpring</display-name>
          <welcome-file-list>
              <welcome-file>index.jsp</welcome-file>
          </welcome-file-list>
           <servlet>
              <servlet-name>dispatcher</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
               <load-on-startup>1</load-on-startup>
          </servlet>
           <listener>
              <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
          </listener> 
          <context-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>
                  /WEB-INF/dispatcher-servlet.xml
              </param-value>
          </context-param>
          <servlet-mapping>
              <servlet-name>dispatcher</servlet-name>
              <url-pattern>*.htm</url-pattern>
          </servlet-mapping>
          <session-config>
              <session-timeout>30</session-timeout>
          </session-config>
      </web-app>
      
      
      **persistence.xml**
      
      
      <?xml version="1.0" encoding="UTF-8"?>
      <persistence version="1.0"
          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_1_0.xsd">
          <persistence-unit name="localPersistenceUnitOne"
              transaction-type="RESOURCE_LOCAL">
              <provider>org.hibernate.ejb.HibernatePersistence</provider>
              <class>in.india.entities.CustomerDetails</class>
              <exclude-unlisted-classes />
              <properties>
                  <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
                  <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
                  <property name="hibernate.jdbc.batch_size" value="0" />
                  <property name="hibernate.show_sql" value="false" />
                  <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/shankar?sslmode=require" />
                  <property name="hibernate.connection.username" value="username" />
                  <property name="hibernate.connection.password" value="password" />
                  <property name="hibernate.hbm2ddl.auto" value="update" />
              </properties>
          </persistence-unit>
          <persistence-unit name="localPersistenceUnitTwo"
              transaction-type="RESOURCE_LOCAL">
              <provider>org.hibernate.ejb.HibernatePersistence</provider>
              <class>in.india.entities.CompanyDetails</class>
              <exclude-unlisted-classes />
              <properties>
                  <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
                  <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
                  <property name="hibernate.jdbc.batch_size" value="0" />
                  <property name="hibernate.show_sql" value="false" />
                  <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/shankarTwo?sslmode=require" />
                  <property name="hibernate.connection.username" value="username" />
                  <property name="hibernate.connection.password" value="password" />
                  <property name="hibernate.hbm2ddl.auto" value="update" />
              </properties>
          </persistence-unit>
      </persistence>
      
      
      **dispatcher-servlet**
      
      
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:task="http://www.springframework.org/schema/task" xmlns:p="http://www.springframework.org/schema/p"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
          xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
          xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util"
          default-autowire="byName"
          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-3.0.xsd  
            http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
            http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
          <!-- Configure messageSource -->
      
          <mvc:annotation-driven />
          <context:component-scan base-package="in.india.*" />
          <bean id="messageResource"
              class="org.springframework.context.support.ResourceBundleMessageSource"
              autowire="byName">
              <property name="basename" value="messageResource"></property>
          </bean>
      
          <bean
              class="org.springframework.web.servlet.view.InternalResourceViewResolver">
              <property name="prefix">
                  <value>/WEB-INF/jsp/</value>
              </property>
              <property name="suffix">
                  <value>.jsp</value>
              </property>
          </bean>
      
      
      
          <bean id="entityManagerFactoryOne"
              class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
              autowire="constructor">
              <property name="persistenceUnitName" value="localPersistenceUnitOne" />
          </bean>
      
          <bean id="messageSource"
              class="org.springframework.context.support.ResourceBundleMessageSource"
              autowire="byName">
              <property name="basename" value="messageResource" />
          </bean>
      
          <bean id="entityManagerFactoryTwo"
              class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
              autowire="constructor">
              <property name="persistenceUnitName" value="localPersistenceUnitTwo" />
          </bean>
      
          <bean id="manager1" class="org.springframework.orm.jpa.JpaTransactionManager">
              <property name="entityManagerFactory" ref="entityManagerFactoryOne" />
          </bean>
      
          <bean id="manager2" class="org.springframework.orm.jpa.JpaTransactionManager">
              <property name="entityManagerFactory" ref="entityManagerFactoryTwo" />
          </bean>
      
          <tx:annotation-driven transaction-manager="manager1" />
          <tx:annotation-driven transaction-manager="manager2" />
      
          <!-- declare dependies here -->
      
          <bean class="in.india.service.dao.impl.CustomerServiceImpl" />
          <bean class="in.india.service.dao.impl.CompanyServiceImpl" />
      
          <!-- Configure MVC annotations -->
          <bean
              class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
          <bean
              class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
          <bean
              class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
      </beans>
      
      
      
      **java class to persist into one database**
      
      
      package in.india.service.dao.impl;
      
      import in.india.entities.CompanyDetails;
      import in.india.service.CompanyService;
      
      import javax.persistence.EntityManager;
      import javax.persistence.PersistenceContext;
      
      import org.springframework.transaction.annotation.Transactional;
      
      public class CompanyServiceImpl implements CompanyService {
      
          @PersistenceContext(unitName = "entityManagerFactoryTwo")
          EntityManager entityManager;
      
          @Transactional("manager2")
          @Override
          public boolean companyService(CompanyDetails companyDetails) {
      
              boolean flag = false;
              try 
              {
                  entityManager.persist(companyDetails);
                  flag = true;
              } 
              catch (Exception e)
              {
                  flag = false;
              }
      
              return flag;
          }
      
      }
      
      
      **java class to persist in another database** 
      
      package in.india.service.dao.impl;
      
      import javax.persistence.EntityManager;
      import javax.persistence.PersistenceContext;
      
      import org.springframework.transaction.annotation.Transactional;
      
      import in.india.entities.CustomerDetails;
      import in.india.service.CustomerService;
      
      public class CustomerServiceImpl implements CustomerService {
      
          @PersistenceContext(unitName = "localPersistenceUnitOne")
          EntityManager entityManager;
      
          @Override
          @Transactional(value = "manager1")
          public boolean customerService(CustomerDetails companyData) {
      
              boolean flag = false;
              entityManager.persist(companyData);
              return flag;
          }
      }
      
      
      **customer.jsp**
      
      <%@page language="java" contentType="text/html; charset=ISO-8859-1"
          pageEncoding="ISO-8859-1"%>
      <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
      <html>
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
      <title>Insert title here</title>
      </head>
      <body>
          <center>
              <h1>SpringWithMultipleDatabase's</h1>
          </center>
          <form:form method="GET" action="addCustomer.htm"  modelAttribute="customerBean" >
              <table>
                  <tr>
                      <td><form:label path="firstName">First Name</form:label></td>
                      <td><form:input path="firstName" /></td>
                  </tr>
                  <tr>
                      <td><form:label path="lastName">Last Name</form:label></td>
                      <td><form:input path="lastName" /></td>
                  </tr>
                  <tr>
                      <td><form:label path="emailId">Email Id</form:label></td>
                      <td><form:input path="emailId" /></td>
                  </tr>
                  <tr>
                      <td><form:label path="profession">Profession</form:label></td>
                      <td><form:input path="profession" /></td>
                  </tr>
                  <tr>
                      <td><form:label path="address">Address</form:label></td>
                      <td><form:input path="address" /></td>
                  </tr>
                  <tr>
                      <td><form:label path="age">Age</form:label></td>
                      <td><form:input path="age" /></td>
                  </tr>
                  <tr>
                      <td><input type="submit" value="Submit"/></td>
                   </tr>
              </table>
          </form:form>
      </body>
      </html>
      
      
      **company.jsp**
      
      
      <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
      <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
      <html>
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
      <title>ScheduleJobs</title>
      </head>
      <body>
       <center><h1>SpringWithMultipleDatabase's</h1></center>
       <form:form method="GET" action="addCompany.htm"  modelAttribute="companyBean" >
       <table>
          <tr>
              <td><form:label path="companyName">Company Name</form:label></td>
              <td><form:input path="companyName" /></td>
          </tr>
          <tr>
              <td><form:label path="companyStrength">Company Strength</form:label></td>
              <td><form:input path="companyStrength" /></td>
          </tr>
          <tr>
              <td><form:label path="companyLocation">Company Location</form:label></td>
              <td><form:input path="companyLocation" /></td>
          </tr>
           <tr>
              <td>
                  <input type="submit" value="Submit"/>
              </td>
          </tr>
       </table>
       </form:form>
      </body>
      </html>
      
      **index.jsp**
      
      <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
          pageEncoding="ISO-8859-1"%>
      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
      <html>
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
      <title>Home</title>
      </head>
      <body>
       <center><h1>Multiple Database Connectivity In Spring sdfsdsd</h1></center>
      
      <a href='customerRequest.htm'>Click here to go on Customer page</a>
      <br>
      <a href='companyRequest.htm'>Click here to go on Company page</a>
      </body>
      </html>
      
      **success.jsp**
      
      <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
          pageEncoding="ISO-8859-1"%>
      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
      <html>
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
      <title>ScheduleJobs</title>
      </head>
      <body>
       <center><h1>SpringWithMultipleDatabase</h1></center>
          <b>Successfully Saved</b>
      </body>
      </html>
      
      **CompanyController**
      
      package in.india.controller;
      
      import in.india.bean.CompanyBean;
      import in.india.entities.CompanyDetails;
      import in.india.service.CompanyService;
      
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Controller;
      import org.springframework.ui.Model;
      import org.springframework.ui.ModelMap;
      import org.springframework.web.bind.annotation.ModelAttribute;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestMethod;
      import org.springframework.web.servlet.ModelAndView;
      
      @Controller
      public class CompanyController {
      
          @Autowired
          CompanyService companyService;
      
          @RequestMapping(value = "/companyRequest.htm", method = RequestMethod.GET)
          public ModelAndView addStudent(ModelMap model) {
              CompanyBean companyBean = new CompanyBean();
              model.addAttribute(companyBean);
              return new ModelAndView("company");
          }
      
          @RequestMapping(value = "/addCompany.htm", method = RequestMethod.GET)
          public ModelAndView companyController(@ModelAttribute("companyBean") CompanyBean companyBean, Model model) {
              CompanyDetails  companyDetails = new CompanyDetails();
              companyDetails.setCompanyLocation(companyBean.getCompanyLocation());
              companyDetails.setCompanyName(companyBean.getCompanyName());
              companyDetails.setCompanyStrength(companyBean.getCompanyStrength());
              companyService.companyService(companyDetails);
              return new ModelAndView("success");
      
          }
      }
      
      **CustomerController**
      
      
      package in.india.controller;
      
      import in.india.bean.CustomerBean;
      import in.india.entities.CustomerDetails;
      import in.india.service.CustomerService;
      
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Controller;
      import org.springframework.ui.Model;
      import org.springframework.ui.ModelMap;
      import org.springframework.web.bind.annotation.ModelAttribute;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestMethod;
      import org.springframework.web.servlet.ModelAndView;
      
      @Controller
      public class CustomerController {
      
          @Autowired
          CustomerService customerService;
      
          @RequestMapping(value = "/customerRequest.htm", method = RequestMethod.GET)
          public ModelAndView addStudent(ModelMap model) {
              CustomerBean customerBean = new CustomerBean();
              model.addAttribute(customerBean);
              return new ModelAndView("customer");
          }
      
          @RequestMapping(value = "/addCustomer.htm", method = RequestMethod.GET)
          public ModelAndView customerController(@ModelAttribute("customerBean") CustomerBean customer, Model model) {
              CustomerDetails customerDetails = new CustomerDetails();
              customerDetails.setAddress(customer.getAddress());
              customerDetails.setAge(customer.getAge());
              customerDetails.setEmailId(customer.getEmailId());
              customerDetails.setFirstName(customer.getFirstName());
              customerDetails.setLastName(customer.getLastName());
              customerDetails.setProfession(customer.getProfession());
              customerService.customerService(customerDetails);
              return new ModelAndView("success");
      
          }
      }
      
      
      **CompanyDetails Entity**
      
      
      package in.india.entities;
      
      import javax.persistence.Column;
      import javax.persistence.Entity;
      import javax.persistence.GeneratedValue;
      import javax.persistence.GenerationType;
      import javax.persistence.Id;
      import javax.persistence.SequenceGenerator;
      import javax.persistence.Table;
      
      @Entity
      @Table(name = "company_details")
      public class CompanyDetails {
      
          @Id
          @SequenceGenerator(name = "company_details_seq", sequenceName = "company_details_seq", initialValue = 1, allocationSize = 1)
          @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "company_details_seq")
          @Column(name = "company_details_id")
          private Long companyDetailsId;
          @Column(name = "company_name")
          private String companyName;
          @Column(name = "company_strength")
          private Long companyStrength;
          @Column(name = "company_location")
          private String companyLocation;
      
          public Long getCompanyDetailsId() {
              return companyDetailsId;
          }
      
          public void setCompanyDetailsId(Long companyDetailsId) {
              this.companyDetailsId = companyDetailsId;
          }
      
          public String getCompanyName() {
              return companyName;
          }
      
          public void setCompanyName(String companyName) {
              this.companyName = companyName;
          }
      
          public Long getCompanyStrength() {
              return companyStrength;
          }
      
          public void setCompanyStrength(Long companyStrength) {
              this.companyStrength = companyStrength;
          }
      
          public String getCompanyLocation() {
              return companyLocation;
          }
      
          public void setCompanyLocation(String companyLocation) {
              this.companyLocation = companyLocation;
          }
      }
      
      
      **CustomerDetails Entity**
      
      package in.india.entities;
      
      import javax.persistence.Column;
      import javax.persistence.Entity;
      import javax.persistence.GeneratedValue;
      import javax.persistence.GenerationType;
      import javax.persistence.Id;
      import javax.persistence.SequenceGenerator;
      import javax.persistence.Table;
      
      @Entity
      @Table(name = "customer_details")
      public class CustomerDetails {
      
          @Id
          @SequenceGenerator(name = "customer_details_seq", sequenceName = "customer_details_seq", initialValue = 1, allocationSize = 1)
          @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "customer_details_seq")
          @Column(name = "customer_details_id")
          private Long customerDetailsId;
          @Column(name = "first_name ")
          private String firstName;
          @Column(name = "last_name ")
          private String lastName;
          @Column(name = "email_id")
          private String emailId;
          @Column(name = "profession")
          private String profession;
          @Column(name = "address")
          private String address;
          @Column(name = "age")
          private int age;
          public Long getCustomerDetailsId() {
              return customerDetailsId;
          }
      
          public void setCustomerDetailsId(Long customerDetailsId) {
              this.customerDetailsId = customerDetailsId;
          }
      
          public String getFirstName() {
              return firstName;
          }
      
          public void setFirstName(String firstName) {
              this.firstName = firstName;
          }
      
          public String getLastName() {
              return lastName;
          }
      
          public void setLastName(String lastName) {
              this.lastName = lastName;
          }
      
          public String getEmailId() {
              return emailId;
          }
      
          public void setEmailId(String emailId) {
              this.emailId = emailId;
          }
      
          public String getProfession() {
              return profession;
          }
      
          public void setProfession(String profession) {
              this.profession = profession;
          }
      
          public String getAddress() {
              return address;
          }
      
          public void setAddress(String address) {
              this.address = address;
          }
      
          public int getAge() {
              return age;
          }
      
          public void setAge(int age) {
              this.age = age;
          }
      }
      

      【讨论】:

        【解决方案5】:

        查看此 wiki 页面 http://code.google.com/p/gwt-spring-jpa-lucene/wiki/PersistenceUnitSetup,详细说明如何使用 persistenceXmlLocations 和 DAO 中的注释配置 spring

        【讨论】:

          【解决方案6】:
          1. 为每个持久化单元创建多个entityManagerFactory。
          2. 为@PersistenceContext 指定unitName 属性

          在那些将被注入的 entityManagerFactories 之间切换

          【讨论】:

            猜你喜欢
            • 2012-01-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-18
            • 2010-11-06
            • 2013-12-02
            • 1970-01-01
            • 2017-03-08
            相关资源
            最近更新 更多