Oracle编辑视图和JPA或Hibernate

时间:2016-11-10 13:33:42

标签: hibernate jpa

我的应用程序使用WAS 7和Oracle 11g。我期待在部署期间实现零停机。部署涉及对WAS的EAR部署以及对Oracle DB的DDL / DML更改。这个问题的重点是在DDL / DML升级期间Oracle DB没有停机时间,并且支持Java EE应用程序中的新数据定义。

此处的团队之一已使用每个表的Oracle编辑视图(基于版本的修订版)层实现此目的。但是我的应用程序使用JPA和Hibernate。我已经进行了一个小型PoC来创建用于编辑视图的实体;但似乎JPA或Hibernate不支持它们。

是否有任何关于在JPA或Hibernate中使用版本视图的信息?

2 个答案:

答案 0 :(得分:0)

我建议您查看Liquibase,这将允许应用程序保持自己的数据库更新。

如果你使用弹簧很容易,你只需要一个如下的弹簧豆:

@Bean
public SpringLiquibase liquibase() {
    log.debug("Configuring Liquibase");
    SpringLiquibase liquibase = new SpringLiquibase();
    liquibase.setDataSource(dataSource());
    liquibase.setChangeLog("classpath:config/liquibase/master.xml");
    liquibase.setContexts("development, production");
    return liquibase;
}

然后你有一个更改日志:

databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <changeSet id="1" author="bob">
        <createTable tableName="department">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="varchar(50)">
                <constraints nullable="false"/>
            </column>
            <column name="active" type="boolean" defaultValueBoolean="true"/>
        </createTable>
    </changeSet>

</databaseChangeLog>

每次申请开始时,都会检查是否有任何需要申请的变更。

答案 1 :(得分:0)

一种方法是使用分区表作为主数据表,使用临时表进行更改。您可以使用以下命令对登台表进行更改,然后进行交换:

ALTER TABLE main_table
EXCHANGE PARTITION main_table_1001 WITH TABLE staging_table
WITHOUT VALIDATION
UPDATE GLOBAL INDEXES;

这样,您的客户端(即java web app)甚至不会注意到后端发生的变化。