我在某个时候已经通过编程完成了这一点——即创建两个具有不同数据源的实体管理器,并为不同的服务提供它们。
然而,现在我正在使用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>
Then inside my dao:
public class SimpleDaoImpl implements SimpleDao {
@PersistenceContext
private EntityManager entityManager;
/* methods that use entity manager for transactions and data detcing */
}
那么,在两个具有不同数据源的事务管理器的情况下,如何指定将哪个实体管理器注入哪个DAO,或者这在Spring中是不可能的?
这里我有两个不同数据源的hibernate,我使用@Qualifier来指定会话工厂,像这样:
@Autowired
@Qualifier(value="sessionFactoryOne")
private SessionFactory sessionFactoryOne;
@Autowired
@Qualifier(value="sessionFactoryTwo")
private SessionFactory sessionFactoryTwo;
然后我从这个家伙那里得到会话。
在xml配置中,我有两个数据源,sessionFactory和transactionManager,每个DB一个。
您可以执行@PersistenceContext(unitName="pu1")