2

スタンドアロン アプリケーションで 2 つのデータベースを使用する必要があります。1 つはローカルの HSQLDB で、もう 1 つはリモートの MySQL です。Spring 3.1.2、Hibernate 4.1.7 を使用しています。これまでのところ、私は HSQLDB のみを使用することができました。これは私の DAO と構成がどのように見えるかです。

@Transactional
public abstract class HibernateDao<T, ID extends Serializable> implements Dao<T, ID>{

SessionFactory sessionFactoryHSQL;


public void setSessionFactoryHSQL(SessionFactory sessionFactory) {
    this.sessionFactoryHSQL = sessionFactory;
}

public ID save(T object) {
    return (ID) getCurrentSession().save(object);
}

public void persist(T object){
    getCurrentSession().persist(object);
}

public void update(T object) {
    getCurrentSession().update(object);
}

public void delete(T object) {
    getCurrentSession().delete(object);
}

public List<T> find(String query) {
    return getCurrentSession().createQuery(query).list();
}

public Session getCurrentSession(){
    return sessionFactoryHSQL.getCurrentSession();
}
}


<bean id="sessionFactoryHSQL" 
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

    <property name="dataSource">
      <ref bean="dataSourceHSQL"/>
    </property>

    <property name="hibernateProperties">
       <props>
         <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
         <prop key="hibernate.show_sql">true</prop>
         <prop key="hibernate.hbm2ddl.auto">update</prop>
       </props>
    </property>

    <property name="annotatedClasses">
    <list>
        //annotated classes
    </list>
    </property>
    </bean>

<bean id="txManager" class=
    "org.springframework.orm.hibernate4.HibernateTransactionManager">
   <property name="sessionFactory" ref="sessionFactoryHSQL" />
</bean>
<tx:annotation-driven transaction-manager="txManagerHSQL" />

<bean id="configHSQL"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>properties/HSQL.properties</value>
    </property>
</bean>

<bean id="dataSourceHSQL" 
         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

sessionFactoryMySQL、dataSourceMySQL など、MySQL 用に個別の Bean を作成しました (HSQL の場合とほぼ同じであるため、それらの実装は貼り付けません)。sessionFactoryMySQL を DAO に正しく挿入できましたが、両方の sessionFactory を同時に使用することはできません。たとえば、次のことはできません。

public void persist(T object) {
    sessionFactoryHSQL.getCurrentSession().persist(object);
    sessionFactoryMySQL.getCurrentSession().persist(object);
}

すでに発見したように、トランザクションと関係がありますが、トランザクションマネージャーを適切に構成できません。私は長い間解決策を探してきましたが、例やチュートリアルは明確でなかったか、私のケースを正確に参照していませんでした.

4

1 に答える 1

2

両方のデータベースに 2 つのセッション ファクトリを作成する必要があります。簡単なステップ バイ ステップの例を確認してください: Spring/Hiberate の 2 つのデータソース

于 2014-07-21T06:14:48.527 に答える