Hibernate使用多个数据库

有人知道如何在hibernate配置中添加另一个数据源,以及如何在自己的DAO中将Spring配置为其自动注入该数据源吗?

这是我的带有一个数据源的代码,可以完美运行,但是我不知道如何添加另一个数据源。我想添加另一个数据源,该数据源是具有与实际数据库不同的表的数据库。

HIBERNATE CONF

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName">

<value>com.mysql.jdbc.Driver</value>

</property>

<property name="url" value="jdbc:mysql://localhost/personal"/>

<property name="username" value="root"/>

<property name="password" value="mysql"/>

</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

<property name="dataSource">

<ref local="dataSource"/>

</property>

<property name="packagesToScan">

<list>

<value>com.app.personal.model</value>

</list>

</property>

<property name="hibernateProperties">

<props>

<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

<prop key="hibernate.show_sql">false</prop>

</props>

</property>

</bean>

<tx:annotation-driven/>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory">

<ref local="sessionFactory"/>

</property>

</bean>

DAO EXAMPLE

@Repository

public class ModuloDAOHibernate extends HibernateTemplate implements ModuloDAO {

@Autowired

public ModuloDAOHibernate(SessionFactory sessionFactory) {

super(sessionFactory);

}

public List<Modulo> getAllGrupoModuloDAO() {

Criteria criteriaList = this.getSession().createCriteria(Modulo.class);

criteriaList.addOrder(Order.asc("orden"));

return criteriaList.list();

}

回答:

我假定你有一组应使用的DAO的dataSource1和适当的sessionFactory1,而其他人应该使用不同的dataSouce2sessionFactory2基于dataSource2。当然,你需要声明第二个dataSource和其他bean:只需复制你已有的配置并更改bean id,以免它们冲突。除<tx:annotation-driven/>以下内容外,所有内容均应镜像:

<bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<!-- ... -->

</bean>

<bean id="sessionFactory1" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

<property name="dataSource" ref="dataSource1"/>

<!-- ... -->

</bean>

<bean id="transactionManager1" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory1"/>

<!-- ... -->

</bean>

<bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<!-- ... -->

</bean>

<bean id="sessionFactory2" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

<property name="dataSource" ref="dataSource2"/>

<!-- ... -->

</bean>

<bean id="transactionManager2" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory2"/>

<!-- ... -->

</bean>

<tx:annotation-driven transaction-manager="transactionManager1"/>

真正的问题来了:你现在有两个绑定到不同会话工厂的事务管理器,这些会话工厂又被路由到不同的数据源。但是@Transactional注释将始终仅使用一个事务管理器- transactionManager默认情况下命名的事务管理器(请注意,我明确指出了transactionManager1这一点。这意味着使用第二个数据源的DAO将参与在第一个数据源中启动的事务-这显然不是预期的。

有一些解决方法,例如在@Transactional批注中显式定义事务管理器名称(从未尝试过使用)或使用TransactionTemplate,但是如你所见,应该仔细考虑问题。

至于自动装配-如果你按名称自动装配,请为你的字段命名与会话工厂或数据源ID相同,它应该起作用-但实际上这是你的最小问题。

以上是 Hibernate使用多个数据库 的全部内容, 来源链接: utcz.com/qa/405819.html

回到顶部