在Hibernate 3中,是否可以使用多个数据库和一个SessionFactory以及XML?

在Hibernate 3中,是否可以使用多个数据库和一个SessionFactory以及XML?,hibernate,hibernate-mapping,Hibernate,Hibernate Mapping,例如,我可以为它使用目录属性或模式现在我使用多个数据库和多个SessionFactory,但我希望通过外键在这些数据库之间创建关系,因此,据我所知,我需要使用一个SessionFactory。也许是一些示例配置,我如何实现它? 提前感谢通常,要在多个数据库中保持FK同步,需要使用自己的序列生成器管理FK值。您需要使用XADataSource来确保任何事务都能够跨数据库并适当地回滚 您需要为每个数据库使用一个SessionFactory,因为每个SessionFactory都绑定到一个数据源。J

例如,我可以为它使用
目录
属性或
模式

现在我使用多个数据库和多个SessionFactory,但我希望通过外键在这些数据库之间创建关系,因此,据我所知,我需要使用一个SessionFactory。也许是一些示例配置,我如何实现它?


提前感谢

通常,要在多个数据库中保持FK同步,需要使用自己的序列生成器管理FK值。您需要使用XADataSource来确保任何事务都能够跨数据库并适当地回滚

您需要为每个数据库使用一个SessionFactory,因为每个SessionFactory都绑定到一个数据源。JOTM是由弹簧支撑的

示例Spring上下文如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
 <property name="userTransaction" ref="jotm"/>
</bean>

<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/>

<bean id="oracle1DataSource" class="oracle.jdbc.xa.client.OracleXADataSource">
 <property name="xaDataSource" ref="oracle1DataSourceTarget"/>
 <property name="transactionManager" ref="jotm"/>
</bean>

<bean id="oracle2DataSource" class="oracle.jdbc.xa.client.OracleXADataSource">
 <property name="xaDataSource" ref="oracle2DataSourceTarget"/>
 <property name="transactionManager" ref="jotm"/>
</bean>

<beans>
<bean id="oracle1DataSourceTarget" class="oracle.jdbc.xa.client.OracleXADataSource">
 <property name="URL" value="jdbc:oracle:thin:user/password@server:port:DB1"/>
</bean>

<bean id="oracle2DataSourceTarget" class="oracle.jdbc.xa.client.OracleXADataSource">
 <property name="URL" value="jdbc:oracle:thin:user/password@server:port:DB2"/>
</bean>

<bean id="oracle1SessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
 <property name="dataSource" ref="oracle1DataSource"/>
 <property name="jtaTransactionManager" ref="jotm"/>
 <property name="useTransactionAwareDataSource" value="true"/>
 <property name="hibernateProperties">
   <props>
     <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
   </props>
 </property>
 <property name="mappingResources">
   <list>
     <value>org/example/Entity.hbm.xml</value>
   </list>
 </property>
</bean>

<bean id="oracle2SessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
 <property name="dataSource" ref="oracle2DataSource"/>
 <property name="jtaTransactionManager" ref="jotm"/>
 <property name="useTransactionAwareDataSource" value="true"/>
 <property name="hibernateProperties">
   <props>
     <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
   </props>
 </property>
 <property name="mappingResources">
   <list>
     <value>org/example/Entity.hbm.xml</value>
   </list>
 </property>
</bean>

org.hibernate.dialogue.oracle9dialogue
org/example/Entity.hbm.xml
org.hibernate.dialogue.oracle9dialogue
org/example/Entity.hbm.xml


希望这有帮助。

通常,要在多个数据库中保持FK同步,需要使用自己的序列生成器管理FK值。您需要使用XADataSource来确保任何事务都能够跨数据库并适当地回滚

您需要为每个数据库使用一个SessionFactory,因为每个SessionFactory都绑定到一个数据源。JOTM是由弹簧支撑的

示例Spring上下文如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
 <property name="userTransaction" ref="jotm"/>
</bean>

<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/>

<bean id="oracle1DataSource" class="oracle.jdbc.xa.client.OracleXADataSource">
 <property name="xaDataSource" ref="oracle1DataSourceTarget"/>
 <property name="transactionManager" ref="jotm"/>
</bean>

<bean id="oracle2DataSource" class="oracle.jdbc.xa.client.OracleXADataSource">
 <property name="xaDataSource" ref="oracle2DataSourceTarget"/>
 <property name="transactionManager" ref="jotm"/>
</bean>

<beans>
<bean id="oracle1DataSourceTarget" class="oracle.jdbc.xa.client.OracleXADataSource">
 <property name="URL" value="jdbc:oracle:thin:user/password@server:port:DB1"/>
</bean>

<bean id="oracle2DataSourceTarget" class="oracle.jdbc.xa.client.OracleXADataSource">
 <property name="URL" value="jdbc:oracle:thin:user/password@server:port:DB2"/>
</bean>

<bean id="oracle1SessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
 <property name="dataSource" ref="oracle1DataSource"/>
 <property name="jtaTransactionManager" ref="jotm"/>
 <property name="useTransactionAwareDataSource" value="true"/>
 <property name="hibernateProperties">
   <props>
     <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
   </props>
 </property>
 <property name="mappingResources">
   <list>
     <value>org/example/Entity.hbm.xml</value>
   </list>
 </property>
</bean>

<bean id="oracle2SessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
 <property name="dataSource" ref="oracle2DataSource"/>
 <property name="jtaTransactionManager" ref="jotm"/>
 <property name="useTransactionAwareDataSource" value="true"/>
 <property name="hibernateProperties">
   <props>
     <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
   </props>
 </property>
 <property name="mappingResources">
   <list>
     <value>org/example/Entity.hbm.xml</value>
   </list>
 </property>
</bean>

org.hibernate.dialogue.oracle9dialogue
org/example/Entity.hbm.xml
org.hibernate.dialogue.oracle9dialogue
org/example/Entity.hbm.xml

希望这有帮助