我在 AS400 (iSeries)、hibernate 3、spring 2.0 和 Java 6 上使用 DB2,我在两个不同的库上有两个表(物理文件),如下所示:Library1/TableA 和 Library2/Table2,所以通常我需要一个 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 类一次只能加载一个 sessionFactory,而我的 TableADao 加载了 sessionFactory1AS400,它不知道 TableB 的存在。为了克服这个问题,我将 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 上的模式定义来自 spring 上的配置或任何其他方式来加入这些表?
在此先感谢您的时间。