4

我在某个时候以编程方式完成了这项工作——即创建两个具有不同数据源的实体管理器,并为不同的服务提供它们。

但是现在我正在使用 Spring 构建一个 webApp。事情是我想让两个实体经理负责不同的数据库。所以在我的例子中,一半的 DAO 将使用emNumber1,而另一半将使用emNumber2。哦,完全不同的持久性单元,因为我只需要从DB1读取数据,然后处理它并将这些数据存储在DB2中完全不同的实体中。

我很清楚这个问题已经存在并且已经存在一段时间了,但是以不同的形式和形式存在,所以我提出这个问题只是因为我无法理解那些用谷歌搜索的论坛主题提出的解决方案,或者他们是不适用于我的情况。在同样的情况下,我无法理解解决方案或如何在我的情况下应用它,所以如果要通过链接这个自己的站点的解决方案来解决多余的问题,我真的很抱歉。

这是我认为适合配置单个事务管理器的方法

<tx:annotation-driven transaction-manager="transactionManager" />
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

<bean id="dataSource"
      class="org.springframework.jdbc.datasource.DriverManagerDataSource"
      p:driverClassName="com.mysql.jdbc.Driver"
      p:url="jdbc:mysql://localhost:3306/db"
      p:username="dbuser"
      p:password="dbuser"/>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="pu1"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true"/>
            <property name="generateDdl" value="true"/>
            <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/>
        </bean>
    </property>
</bean>

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

然后在我的道内:

public class SimpleDaoImpl implements SimpleDao {
@PersistenceContext
private EntityManager entityManager;

    /* methods that use entity manager for transactions and data detcing */
}

因此,如果两个事务管理器具有不同的数据源,如何指定将哪个实体管理器注入哪个 DAO 或者在 Spring 中这是不可能的?

4

2 回答 2

0

在这里,我使用两个不同的数据源进行休眠,并使用 @Qualifier 来指定会话工厂,如下所示:

@Autowired
@Qualifier(value="sessionFactoryOne")
private SessionFactory sessionFactoryOne;

@Autowired
@Qualifier(value="sessionFactoryTwo")
private SessionFactory sessionFactoryTwo;

然后我从这些家伙那里得到了会议。

在 xml 配置中,我有两个数据源 sessionFactory 和 transactionManager,每个 DB 一个。工作正常 ;)

于 2014-10-31T19:57:54.047 回答
0

你可以做 @PersistenceContext(unitName="pu1")

于 2020-03-18T16:54:39.547 回答