【问题标题】:Insert into two tables in two different database插入到两个不同数据库中的两个表中
【发布时间】:2014-03-21 08:43:07
【问题描述】:

我在 Spring 框架上的 Java Web 应用程序正在使用两个数据库,即 database-1 和 database-2。两个数据库都有User 表。我要做的是同时将记录插入到两个表中。

persistence.xml 中有两个persistence-unit 指向数据库。

这是我的 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="p1-jpa" transaction-type="RESOURCE_LOCAL">

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


         <jta-data-source>java:jboss/datasources/MySqlDS2</jta-data-source> 

        <class>com.xyz.entity.User</class>
        <exclude-unlisted-classes />

        <properties>
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider" />
        </properties>

    </persistence-unit>

    <persistence-unit name="p2-jpa" transaction-type="RESOURCE_LOCAL">

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


         <jta-data-source>java:jboss/datasources/MySqlDS2</jta-data-source>         
         <class>com.mmxhealthcare.entity.MMASCUser</class>  
         <exclude-unlisted-classes />

        <properties>
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider" />
        </properties>

    </persistence-unit>
    </persistence>

现在每当我尝试添加用户时,它只会插入到 Database-1 中。我没有遇到任何异常。

这是我的spring-servlet.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:jaxrs="http://cxf.apache.org/jaxrs"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:util="http://www.springframework.org/schema/util" xmlns:security="http://www.springframework.org/schema/security"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
        http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-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/security  http://www.springframework.org/schema/security/spring-security-3.1.xsd 
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
        <property name="order" value="0"/>
    </bean>

    <!-- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean> -->
    <context:property-placeholder location="classpath:config.properties" />
    <context:annotation-config />

    <context:component-scan base-package="com.xyz.controller" />
    <context:component-scan base-package="com.xyz.service" />
    <context:component-scan base-package="com.xyz.dao" />
    <context:component-scan base-package="com.xyz.security" />
    <context:component-scan base-package="com.xyz.dto" />
    <context:component-scan base-package="com.xyz.util" />
    <context:component-scan base-package="com.xyz.entity" />

    <tx:annotation-driven />

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <bean id="transactionManager1" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="aaentityManagerFactory" />
    </bean>

    <bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="mmascentityManagerFactory" />
    </bean>

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


    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="d1SourceLocal" />
        <property name="persistenceUnitName" value="p1-jpa" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
    </bean>

    <bean id="mmascentityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="d2DataSourceLocal" />
        <property name="persistenceUnitName" value="p2-jpa" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
    </bean>

    <!-- <bean id="dataSourceLocal" class="org.springframework.jndi.JndiObjectFactoryBean">  
        <property name="jndiName" value="java:jboss/datasources/MySqlDS2"/>  
    </bean> -->

    <!-- Local -->
    <bean id="d1SourceLocal"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${database.driver}" />
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
    </bean>


    <bean id="d2DataSourceLocal"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${d2-database.driver}" />
        <property name="url" value="${d2-database.url}" />
        <property name="username" value="${d2-database.username}" />
        <property name="password" value="${d2-database.password}" />
    </bean>
</beans>

这是我的service 班级:

public class Userservice{
    @Autowired
    Database2IUserDAO immDao;

    @Autowired 
    Database1IUserDAO iaaDao;

    public User saveUser(fname,address){
    User u  = new User(); // This points Database-1 User table.
    u.setFname(fname);
    u.setAddress(address);
    iaaDao.save(u);
    User2 u2 = new User2(); // This points Database-2 User table.
    u2.setFname(fname);
    u2.setAddress(address);
    immDao.save(u2);
    }
}

这是我的Database1IUserDAO //这是一个接口

  package com.xyz.dao;
    public interface Database1IUserDAO {

        public Object save(Object ob);

    }

这是我的Database2IUserDAO //这是database2的另一个接口

package com.xyz.dao;
public interface Database2IUserDAO {

    public Object save(Object ob);

}

** 这终于是 Database-1 和 Database 2 的 DAO 类** 我的两个 DAO 类都扩展了 BaseDao 类,它们具有用于插入或保存的 Save() 方法。

BaseDao.java

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.transaction.annotation.Transactional;


public class BaseDAO {

    protected EntityManager entityManager;

    @PersistenceContext
    public void setEntityManager(EntityManager entityManager) {
        this. entityManager = entityManager;
    }

    @Transactional
    public Object save(Object ob) {
        Object object = entityManager.merge(ob);
        return object;
    }

    @Transactional
    public void remove(Object ob) {
        Object object = entityManager.merge(ob);
        entityManager.remove(object);
    }

    @Transactional
    public int update(String query) {
        return entityManager.createQuery(query).executeUpdate();
    }

}

请帮忙。

【问题讨论】:

  • 您能否也显示将用户添加到数据库的代码的相关信息?

标签: java spring hibernate jpa


【解决方案1】:

您必须使用数据库特定的Transaction Manager,正如您在下面的spring-context.xml 文件中提到的那样。

<bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager">
      <property name="entityManagerFactory" ref="mmascentityManagerFactory" />
</bean>

您应该在您的DAO Class 中创建一个保存功能,并使用特定于数据库的Transaction Manager,如下所示:

@Transactional(value="transactionManager2")
public Object save(Object ob) {
     Object object = entityManager.merge(ob);
     return object;
}

我希望它对你有用。

【讨论】:

    【解决方案2】:

    您似乎对所有 DAO 使用 BaseDAO 中的相同 EntityManager (EM)。由于您没有指定 EM 使用的是哪个 TransactionManager,因此它将默认为这个:

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    

    ...如文档 http://docs.spring.io/spring/docs/2.0.8/reference/transaction.html 中所述(查找表 9.2)

    如果您想写入另一个数据库,您需要明确告诉 Spring 您要使用哪个数据库。以这个答案为例:

    Spring multiple @Transactional datasources

    【讨论】:

      【解决方案3】:

      看起来您对两个持久性单元使用相同的数据源。

      即java:jboss/datasources/MySqlDS2

      所以它只插入到与上述数据源相对应的一个数据库中,例如Mysql DB。

      所以在两个持久化单元中添加不同的数据源,这应该有助于您插入两个数据库。

      它不会给出任何例外,因为您使用的一个数据源可能是有效的数据源(我不能保证,因为我们在您的帖子中没有数据源信息)。

      有其他事情请告诉我。

      【讨论】:

      • 我已经编辑了我的问题并添加了所有相关代码,请看。我现在正在使用 Tomcat。
      • 嘿,你检查过我上面回答的内容
      猜你喜欢
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多