3

AS400 (iSeries)、hibernate 3、spring 2.0、および Java 6 で DB2 を使用しています。Library1/TableA と Library2/Table2 のような 2 つの異なるライブラリに 2 つのテーブル (物理ファイル) があるため、通常は sessionFactory が必要です。次のようなライブラリごとに:

<bean id="sessionFactory1AS400"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSourceAS400" />
        <property name="annotatedClasses">
            <list>
                <value>com.appllication.model.TableA</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                …
                <prop key="hibernate.default_schema">Library1</prop>
            </props>
        </property>
    </bean>

<bean id="sessionFactory2AS400"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSourceAS400" />
        <property name="annotatedClasses">
            <list>
                <value>com.appllication.model.TableB</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                …
                <prop key="hibernate.default_schema">Library2</prop>
            </props>
        </property>
    </bean>

次のようにクラスのテーブルに参加しようとしています:

@Entity(name = "TableA")
public class TableA {

@ManyToOne(targetEntity=TableB.class, fetch=FetchType.LAZY)
    @JoinColumns(
            {
                @JoinColumn(name="column1", referencedColumnName="column1", insertable=false, updatable=false),
                @JoinColumn(name="column2", referencedColumnName="column2", insertable=false, updatable=false)
            })
    private TableB tableB;

…
}

しかし、単体テストを実行すると失敗します。これは、DAO クラスが一度に 1 つの sessionFactory しかロードできず、TableADao が TableB の存在を認識していない sessionFactory1AS400 をロードするためです。この問題を解決するために、TableB を TableA と同じ sessionFactory に移動しました。

<bean id="sessionFactory1AS400"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSourceAS400" />
        <property name="annotatedClasses">
            <list>
                <value>com.appllication.model.TableA</value>
<value>com.appllication.model.TableB</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                …
                <prop key="hibernate.default_schema">Library1</prop>
            </props>
        </property>
    </bean>

そして、クラス TableB にスキーマの定義を追加しました。

@Entity(name="TableB")
@Table(schema="Library2")
public class TableB implements Serializable {
…
}

今回はテストが正常に実行され、正しいクエリが得られました。

SELECT * FROM Library1.TableA ta INNER JOIN Library2.TableB tb ON ta.column1 = tb.column1 AND ta.column2 = tb.column2

今私の問題は、ライブラリ名が異なるさまざまな環境があるため、TableB のスキーマ定義が構成ファイルから読み込まれるのではなく、ハードコードされていることです。これは完璧なシナリオです。

TableB のスキーマ定義を春の構成から取得する方法や、これらのテーブルを結合する他の方法はありますか?

お時間をいただきありがとうございます。

4

2 に答える 2

2

2つの異なるライブラリを介してテーブルを結合するのは非常に簡単です。必要なのはいくつかの追加のJDBCパラメータだけです。

JDBC URLに、パラメーター「libraries」と「naming」を追加します。例:jdbc:as400:// systemName /; libraries = "Library1 Library2"; naming = system

上記のJDBCURLを使用すると、次のクエリを実行できます。

select * from TableA internal join TableB on ...=..。

iSeriesマシンは、「libraries」パラメーターを使用して物理ファイルを検索します。競合を防ぐために、物理ファイル名を両方のライブラリ間で一意にします。

乾杯、

于 2013-01-25T19:34:34.230 に答える
1

Annotations の代わりに Hibernate の *.hbm.xml 構成を使用するのはどうですか?

<class name="TableB" table="table_b" schema="Library2">
    . . .
</class>

次に、Spring コンテキスト XML にロードする *.hbm.xml ファイルを指定し、PropertyPlaceHolderConfigurer などで構成されたプロパティを使用できます。

于 2012-06-13T21:53:37.587 に答える