是否有可能在Hibernate 3中使用带有一个SessionFactory的数据库?
问题描述:
例如,我可以使用catalog
属性或schema
吗?
现在我使用几个数据库和几个sessionfactories,但我想通过外键在这些数据库之间创建关系,所以我需要使用一个SessionFactory,据我了解。也许有一些示例配置,我该如何实现它?
预先感谢是否有可能在Hibernate 3中使用带有一个SessionFactory的数据库?
答
一般情况下,试图让FKS在同步跨越超过1个数据库将要求您使用自己的序列发生器管理您的FK值。您将需要使用XADataSource来确保任何事务都能够跨两个数据库并进行适当的回滚。
因为每个SessionFactory绑定到一个DataSource,所以您将需要为每个数据库使用一个SessionFactory。 JOTM是Open Java Transaction Manager,并受Spring支持。
一个例子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/[email protected]:port:DB1"/>
</bean>
<bean id="oracle2DataSourceTarget" class="oracle.jdbc.xa.client.OracleXADataSource">
<property name="URL" value="jdbc:oracle:thin:user/[email protected]: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>
希望这有助于。