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 のスキーマ定義を春の構成から取得する方法や、これらのテーブルを結合する他の方法はありますか?
お時間をいただきありがとうございます。