Java 插入到两个不同数据库中的两个表中

Java 插入到两个不同数据库中的两个表中,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我在spring框架上的Java web应用程序使用两个数据库,即database-1和database-2。两个数据库都有User表。我试图做的是将记录同时插入两个表中 在指向数据库的persistence.xml中有两个persistence单元 这是我的persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persisten

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

在指向数据库的
persistence.xml
中有两个
persistence单元

这是我的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>

这是我的
服务
课程:

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);
    }
}
这是我的
数据库1iUserDAO
//这是一个接口

  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();
    }

}

请提供帮助。

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

ie java:jboss/datasources/MySqlDS2

因此,它只插入到与上述数据源mstly Mysql DB相对应的一个DB中

因此,在两个持久化单元中都添加不同的数据源,这将有助于您插入两个数据库

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


请告诉我其他情况。

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

ie java:jboss/datasources/MySqlDS2

因此,它只插入到与上述数据源mstly Mysql DB相对应的一个DB中

因此,在两个持久化单元中都添加不同的数据源,这将有助于您插入两个数据库

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


其他任何事情请告诉我。

您似乎在对所有DAO使用来自BaseDAO的同一个EntityManager(EM)。由于您没有指定EM正在使用的TransactionManager,因此它将默认为此TransactionManager:

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

。。。如文件所述(见表9.2)

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


您似乎在对所有DAO使用来自BaseDAO的同一个EntityManager(EM)。由于您没有指定EM正在使用的TransactionManager,因此它将默认为此TransactionManager:

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

。。。如文件所述(见表9.2)

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


您必须使用特定于数据库的
事务管理器,正如您在
spring context.xml
文件中提到的那样,如下所示

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

我希望它能为您工作。

您必须使用特定于数据库的
事务管理器
,如您在
spring context.xml
文件中所述,如下所示

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

我希望它能对您起作用。

您还可以在数据库中添加用户的地方显示代码的相关信息吗?您还可以在数据库中添加用户的地方显示代码的相关信息吗?我已经编辑了我的问题并添加了所有相关代码,请查看。我现在正在使用Tomcat。嘿,你检查了我上面的回答了吗?我已经编辑了我的问题并添加了所有相关的代码,请看。我现在正在使用Tomcat。嘿,你检查了我上面的回答了吗