spring - Hibernate hibernate.ddl-auto - 如何避免在应用程序首次启动后手动需要将“create”替换为“update”
问题描述
如果我希望 Hibernate 为我创建架构,我需要设置
spring.jpa.hibernate.ddl-auto=create
一旦它被创建,我需要手动将它更新为update
或者只是注释掉这个属性行。
如果我忘记更新它,每次应用重启都会删除所有数据库数据并重新创建架构。
我想在这里消除手动的东西。当应用程序在不同环境之间移动时,我不想记住更改值(另一个开发人员,QA env 1,QA env 2,......)
是否没有告诉休眠的选项:仅在缺少模式时才创建模式,否则不更新/不执行任何操作?
解决方案
一般来说,这是一个坏主意。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
在需要时运行语句或类似语句。
这是值得的。
推荐阅读
- javascript - 如何在 Vue v-if 中使用异步函数?
- python - 有没有办法训练 ML 模型将单词分类?
- python-3.x - 在 Python 中检查回文三角形正方形
- python - 熊猫 groupby + 变换和多列
- java - Intellj 无法解析符号 Junit., Cucumber
- oracle - Oracle SQL 需要某个日期后月份的第一天和最后一天的列表
- python - 为什么 expm(2*A) != expm(A) @ expm(A)
- python - 我想应用循环,但我不知道如何在我的代码上应用它
- php - PHP - 更新 mysql 数据库的 ajax 请求
- apache - 当我访问 /folder/ URL 时,Mod 重写规则以服务 folder.php