Java和HSQLDB,更新后如何自动添加列

Posted

技术标签:

【中文标题】Java和HSQLDB,更新后如何自动添加列【英文标题】:Java and HSQLDB, how to add column automatically after update 【发布时间】:2015-06-07 02:50:02 【问题描述】:

我有一个使用 HSQLDB 数据库的 Java Spring 应用程序。

为了进化,我必须在现有表中添加一列。 所以,我已经完成了我必须做的事情(在实体类中添加属性和信息)但是当我在 tomcat 中部署我的新应用程序时,数据库没有更新,我无法启动我的应用程序。

是否可以自动添加列?

这里是applicationContext.xml中数据库的配置:

<bean id="myEmf"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSourceDb" />
    <property name="jpaVendorAdapter">
        <bean
            class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="true" />
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.format_sql">false</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
</bean>

感谢您的帮助。

【问题讨论】:

你在使用 Hibernate 吗?见***.com/questions/306806/… 您好,感谢您的帮助。我看到了这一点,并使用 hbm2ddl.auto 将我的 spring 配置更新为“更新”,但它不起作用:(我已经用配置编辑了我的问题 【参考方案1】:

当然,如果你使用 Hibernate,你可以利用对象模型的自动生成。 但是这种方式不适合生产使用。 我建议你使用数据库迁移工具。它为您提供按特定顺序自动执行 sql 脚本的方法。 看flyway,liquibase。

【讨论】:

谢谢你的回答,但这需要安装一个外部工具,有没有什么不安装任何东西的好方法? 不是自动安装外部工具。 Flyway 至少可以成为您应用程序中的依赖项,并且可以在应用程序启动时运行,在 Hibernate 启动之前。 哦,好吧!我会看到它,并会回到这里告知进展情况。非常感谢! 嗨,我已经通过maven将flyway添加到我的项目中,它不会自动创建列,所以我有一个问题:是否需要在db/migration文件夹中添加迁移文件?我希望 flyway 基于我的类声明并自动与数据库进行比较,这可能吗?感谢您的帮助。 不,flyway 使用您的脚本。这种方法对于生产来说更加清晰。【参考方案2】:

非常感谢您的帮助。 这是我为使用 flyway 更新数据库结构所做的所有操作。有一天,它可能会对某人有所帮助。

    将 Flyway 依赖项添加到我的 pom.xml 中:http://flywaydb.org/documentation/api/

    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
        <version>3.2.1</version>
    </dependency>
    

    将 Flyway 配置添加到我的应用程序上下文中:

    <bean id="flyway" class="org.flywaydb.core.Flyway" init-method="migrate">
        <property name="baselineOnMigrate" value="true" />
        <property name="dataSource" ref="dataSourceDb"/>
    </bean>
    
    <bean id="persistenceUnitManager" depends-on="flyway"
       class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
       <property name="defaultDataSource" ref="dataSourceDb" />
    </bean>
    

我添加了属性baselineOnMigrate,因为我遇到了一个错误,并且错误消息说将此属性设置为true将解决问题。

    在文件夹 src/main/resources/db/migration 下创建一个名为 V2__add_datatype_column.sql 的脚本

    ALTER TABLE PUBLICATION ADD COLUMN datatype varchar(6);
    

    构建,它​​可以工作。

    非常感谢 retroq、Rich 和 Michael Pralow 的回答。

【讨论】:

嗨,又是我,只是一个信息,这些操作将适用于从现有数据库迁移,不要忘记创建创建脚本,如果数据库不存在则创建该脚本。我遇到了这个问题,但解决起来并不复杂。

以上是关于Java和HSQLDB,更新后如何自动添加列的主要内容,如果未能解决你的问题,请参考以下文章

根据其他列在 HSQLDB 中添加日期间隔

如何在 SQL Server 2008 R2 表中添加“上次更新”列?

如何编写一个同时适用于 HSQLDB 和 MySQL 的查询以在 WHERE 子句中为日期添加天数?

php读取mysql数据后如何自动添加一个序号列?

如何在 SQL Server 表中添加“最后修改”和“创建”列?

如何根据python中的另一列自动添加日期?