首页 > 解决方案 > Hibernate hibernate.ddl-auto - 如何避免在应用程序首次启动后手动需要将“create”替换为“update”

问题描述

如果我希望 Hibernate 为我创建架构,我需要设置

spring.jpa.hibernate.ddl-auto=create

一旦它被创建,我需要手动将它更新为update或者只是注释掉这个属性行。

如果我忘记更新它,每次应用重启都会删除所有数据库数据并重新创建架构。

我想在这里消除手动的东西。当应用程序在不同环境之间移动时,我不想记住更改值(另一个开发人员,QA env 1,QA env 2,......)

是否没有告诉休眠的选项:仅在缺少模式时才创建模式,否则不更新/不执行任何操作

标签: springhibernatejpaspring-data-jpa

解决方案


一般来说,这是一个坏主意。create-drop用于测试,update不推荐用于生产。

生产系统应始终使用validate. 不要让休眠创建表。

您最好使用像liquibase这样可以安全地处理数据库更新以进行应用程序升级的工具。当您使用 Spring 时,您可以在 XML 中设置可以与 maven -P 设置一起使用的配置文件,以便您拥有一个用于生产的配置文件,例如

<beans profile="liquibase">
    <bean id="liquibase" class="liquibase.integration.spring.SpringLiquibase" depends-on="systemProperties">
        <property name="dataSource" ref="dataSource" />
        <property name="changeLog" value="classpath:liquibase-changelog.xml" />
        <property name="defaultSchema" value="${jdbc.schema}" />
    </bean>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" depends-on="liquibase">
        <property name="persistenceUnitName" value="PersistenceUnit" />
    </bean>
</beans>

然后在启动时设置数据库。Liquibase 将知道哪些语句已运行,并且仅alter table在需要时运行语句或类似语句。

这是值得的。


推荐阅读