2009-12-14 37 views
30

Estoy intentando configurar Spring + Hibernate + JPA para trabajar con dos bases de datos (MySQL y MSSQL).Base de datos múltiple con Spring + Hibernate + JPA

Mi fuente de datos-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> 

Cada persistence.xml contiene una unidad, como esto:

<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 causa siguiente excepción:

No se puede resolver la referencia Bean 'persistenceUnitManager' al establecer bean p roperty 'persistenceUnitManager'; anidada excepción es org.springframework.beans.factory.BeanCreationException: Error bean creando con nombre 'persistenceUnitManager' se define en el recurso camino clase [config/fuente de datos-context.xml]: Inicialización de haba fallado; anidada excepción es org.springframework.beans.TypeMismatchException: no pudo convertir valor de la propiedad de tipo [java.util.ArrayList] para requerido tipo [java.lang.String] para propiedad 'persistenceXmlLocation'; anidada excepción es java.lang.IllegalArgumentException: no puede convertir valor de tipo [java.util.ArrayList] para requerida tipo [java.lang.String] para propiedad 'persistenceXmlLocation': no ​​hay que emparejan editores o estrategia de conversión encontrado

Si se deja sin una sola persistence.xml lista, todos los trabajos muy bien pero necesito 2 unidades ...

también trato de encontrar una solución alternativa para el trabajo con dos bases de datos en el contexto de primavera + Hibernate , por lo que agradecería cualquier solución.

Nueva error después de cambiar a persistenceXmlLocations:

Sin única unidad de persistencia predeterminado definido en la ruta de clase {: config/persistence.local.xml, ruta de clases: config/persistence.remote.xml}

Actualización:

Agrego persistenceUnitName, funciona, pero solo con una unidad, todavía necesita ayuda.

Actualización:

he cambiado los archivos de configuración: fuente de datos-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> 

persistencia.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> 

Ahora se construye de dos EntityManagerFactory, pero ambos son para 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) 

sugiero que utilice sólo dataSource, dataSourceRemote (sin sustitución) no se trabaja. Ese es mi último problema.

Respuesta

15

Es necesario utilizar persistenceXmlLocations propiedad (nótese el plural) en lugar de persistenceXmlLocation. Es una matriz de cadenas, por lo que será la conversión automática de la lista:

<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> 
    ... 

actualización (basado en edición)

Su entityManagerFactory no especifica persistenceUnitName propiedad. Tienes que hacerlo explícitamente porque estás definiendo más de una unidad de persistencia y entityManagerFactory tiene que saber cuál usar.

+0

:) gracias, tienes razón, pero ahora tengo nuevo error – ziftech

+0

Si está relacionado con éste, tal vez puede actualizar su pregunta y voy a echar un vistazo. Si no está directamente relacionado, probablemente sea mejor publicar una nueva pregunta. – ChssPly76

+1

bien, entonces si configuro persistenceUnitName explícitamente, funcionará, pero solo con una unidad. ¿Cómo puedo cambiar unidades en la aplicación? – ziftech

6

Si sigue este tutorial, http://www.javacodegeeks.com/2010/05/jboss-42x-spring-3-jpa-hibernate.html que pueden realizar los siguientes cambios para acceder a dos bases de datos diferentes:

  1. persistence.xml, definir una segunda unidad de pesristence para su segunda base de datos.
  2. spring.xml, definir una segunda frijol EntityManagerFactory con un nombre diferente, digamos "entityManagerFactoryDB2" y configurarlo para utilizar la unidad persistente para la segunda base de datos.
  3. para cada DAO desea acceder a la segunda base de datos son los siguientes:

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

Eso es todo!

En las clases de servicio de resorte, use los DAOs como de costumbre!

8

Justin, el número 3 se puede hacer de una manera más estándar como esto:

  1. En el contexto de primavera:

    <context:annotation-config /> 
    
  2. En sus DAOs Spring gestionados (tenga en cuenta la propiedad unitName):

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

De esta forma, un EntityManager correctamente intacto que corresponde a la unidad de persistencia llamada "pu1" se inyectará en los DAO correspondientes.

+0

No creo que Spring admita el atributo unitName antes de la versión 3, FYI. – Lyle

1

He resuelto el problema (Cómo conectar múltiples bases de datos utilizando la primavera y Hibernate) de esta manera, espero que le ayudará :) NOTA:he añadido el código en cuestión, amablemente el DAO con la ayuda de impl que utilicé en el siguiente código mencionado.

**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; 
    } 
} 
0
  1. crear EntityManagerFactory múltiple correspondiente a cada unidad de persistencia.
  2. especificar la propiedad unitName para @PersistenceContext

alternar esos entityManagerFactories aquellos se inyectarán

Cuestiones relacionadas