Multiple database with Spring+Hibernate+JPA

后端 未结 6 1521
别跟我提以往
别跟我提以往 2020-12-04 13:43

I\'m trying to configure Spring+Hibernate+JPA for work with two databases (MySQL and MSSQL).

My datasource-context.xml:



        
相关标签:
6条回答
  • 2020-12-04 13:54

    Check this wiki page http://code.google.com/p/gwt-spring-jpa-lucene/wiki/PersistenceUnitSetup that details how to configure spring with persistenceXmlLocations and the annotations in DAO

    0 讨论(0)
  • 2020-12-04 13:58
    1. create multiple entityManagerFactory corresponding to every persistence unit.
    2. specify unitName property for @PersistenceContext

    switch among those entityManagerFactories those will be injected

    0 讨论(0)
  • 2020-12-04 13:59

    I solved the problem (How to connect multiple database using spring and Hibernate) in this way, I hope it will help :) NOTE: I have added the relevant code, kindly make the dao with the help of impl I used in the below mentioned code.

    **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 讨论(0)
  • 2020-12-04 14:01

    Justin, number 3 can be done in a more standard way like this:

    1. In your Spring context:

      <context:annotation-config />
      
    2. In your Spring-managed DAOs (note the unitName property):

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

    This way a properly intantiated EntityManager corresponding to the persistence unit named "pu1" would be injected in the corresponding DAOs.

    0 讨论(0)
  • 2020-12-04 14:10

    You need to use persistenceXmlLocations property (note the plural) rather than persistenceXmlLocation. It's a string array, so it'll be auto-converted from list:

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

    Update (based on edit)

    Your entityManagerFactory does not specify persistenceUnitName property. You have to do so explicitly because you're defining more than one persistence unit and entityManagerFactory has to know which one to use.

    0 讨论(0)
  • 2020-12-04 14:10

    If you follow this tutorial, http://www.javacodegeeks.com/2010/05/jboss-42x-spring-3-jpa-hibernate.html you can make the following changes to access two different databases:

    1. persistence.xml, define a second pesristence-unit for your second database.
    2. spring.xml, define a second entityManagerFactory bean under a different name, lets say "entityManagerFactoryDB2" and configure it to use the persistent unit for the second database.
    3. for every DAO you want to access the second database include the following :

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

    Thats all!

    On spring service classes, use the DAOs as usual!

    0 讨论(0)
提交回复
热议问题