java - 使用 java、DB2、spring 和 hibernate 连接来自两个不同库的两个表

标签 java sql spring hibernate db2

我在 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>

我正在尝试像这样加入我类的 table :

@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 加载了不知道 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 上的模式定义来自 spring 上的配置或任何其他连接这些表的方式?

提前感谢您的宝贵时间。

最佳答案

通过 2 个不同的库连接表非常简单,您只需要一些额外的 JDBC 参数:

在 JDBC url 中添加参数“libraries”和“naming”。例如。 jdbc:as400://systemName/;libraries="Library1 Library2";naming=system

使用上面的 JDBC url,您将能够执行此查询:

从表A中选择* 在 ... = ... 上内部加入 TableB

iSeries 机器将使用“libraries”参数来查找物理文件。让您的物理文件名在两个库中都是唯一的,以防止冲突。

干杯,

关于java - 使用 java、DB2、spring 和 hibernate 连接来自两个不同库的两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10518395/

相关文章:

java - 单击按钮时通过servlet从另一个jsp页面重定向到jsp页面?

java - 数据库表中的特殊记录,如果发生更改,应反射(reflect)所有其他关联记录的更改

java - Spring项目期望位于根目录,当它不在根目录时会很奇怪

java - Salesforce 批量 API 和 Apache Camel Salesforce 组件

java - 请在 Charts4j 上发布一些教程链接

java - 将 <Object, AtomicInteger> 映射到关联数组

MySQL:计算空行的累积和

sql - SSIS 包将数据加载到 azure 数据仓库时出错

spring boot 尝试找到 EnableWebSecurity 类,尽管它不包括在内

spring - 如何确保 Camel 的 ProducerTemplate 等待 CamelContext 启动