需要使用Hibernate和JPA连接两个数据库

时间:2012-11-14 20:42:39

标签: database spring hibernate jpa configure

我有一个使用一个数据库的应用程序,现在我已经配置了这个data-access-config.xml。

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
    <!-- Instructs Spring to perfrom declarative transaction management on annotated classes -->
    <tx:annotation-driven />
    <!-- Drives transactions using local JPA APIs -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    <!-- Creates a EntityManagerFactory for use with the Hibernate JPA provider and a simple in-memory data source populated with test data -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
    </bean>
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://localhost:5432/database1" />
        <property name="username" value="admin1" />
        <property name="password" value="some_pass" />
    </bean>
</beans>

它连接良好,但现在我需要配置第二个数据库(在同一个服务器中),试图复制EntityManagerfactory但是抛出一个错误,不能同时拥有两个实体管理器,所以我很困惑。我正在使用Hibernate + JPA + Spring

感谢!!!

2 个答案:

答案 0 :(得分:1)

我相信这样的事情应该有效:

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    ...
</bean>

<bean id="emf1" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource1" />
    ...
</bean>

在DAO中,使用

@PersistenceContext(unitName = "emf1")
private EntityManager em;

以上将告诉DAO使用emf1实例。

也许你忘了给你的第二个实体经理命名与你的第一个不同的东西?

答案 1 :(得分:0)

您可能需要使用“持久性单元管理器”来帮助管理持久性单元。请参阅Spring documentation on multiple persistence units。您将拥有2个数据源,1个实体管理器工厂和1个持久性单元管理器。

实体管理器因子将引用持久性单元管理器(而不是2个数据源),然后持久性单元管理器将引用2个数据源。