spring.jpa.hibernate.ddl-auto属性在Spring中如何正常工作?


126

我当时在从事我的Spring Boot应用程序项目,并注意到,有时到另一个服务器(SQL Server)上的数据库存在连接超时错误。当我尝试执行一些脚本迁移时,这种情况会特别发生,FlyWay但在尝试几次后仍可以正常工作。

然后我注意到我没有spring.jpa.hibernate.ddl-auto在属性文件中指定 。我做了一些研究,发现建议增加 spring.jpa.hibernate.ddl-auto= create-drop开发。并将其更改为:spring.jpa.hibernate.ddl-auto= none生产中。

但是我实际上并不了解它实际上是如何工作的,以及休眠如何使用create-dropnone值生成数据库模式。您能否从技术上解释它是如何工作的,以及在开发和生产服务器上使用此属性的建议?谢谢


1
FWIW JPA 2.1具有标准属性javax.persistence.schema-generation.database.action,因此实际上并没有看到需要使用JPA供应商特定的属性来生成模式。
尼尔·斯托克顿

@NeilStockton我们正在使用Hibernate 6探索的一个想法是能够基于类别以不同方式控制模式生成的能力。例如,您的orm表可能是,none但是您可能希望使用Hibernate Search和Envers表来生成update它们,因为它们是由那些项目内部管理的,并且您不想自己手动管理它们。现在,我们对所有表进行全局控制,无论其来源/来源如何。如果要使用此选项,这将进一步说明使用供应商特定选项的原因。
罗斯(Naros)'18年

Answers:


212

作为记录,该spring.jpa.hibernate.ddl-auto属性是Spring Data JPA特定的,并且是他们指定一个值的方法,该值最终将在其已知的属性下传递给Hibernate hibernate.hbm2ddl.auto

createcreate-dropvalidate,和update基本上影响架构管理工具将如何处理在启动数据库模式。

例如,该update操作将查询JDBC驱动程序的API以获取数据库元数据,然后Hibernate根据读取带注释的类或HBM XML映射比较它创建的对象模型,并尝试动态调整架构。

update例如,该操作将尝试添加新的列,约束等,但绝不会删除以前可能已存在但不再作为先前运行的对象模型一部分的列或约束。

通常,在测试用例场景中,您可能会使用create-drop它来创建架构,测试用例添加一些模拟数据,运行测试,然后在测试用例清理期间删除架构对象,从而保留一个空数据库。

在开发中,通常会看到开发人员update用来自动修改架构以在重新启动时添加新的内容。但是要再次理解,这不会删除以前执行中可能不再存在的列或约束。

在生产中,通常强烈建议您使用none或根本不指定此属性。这是因为DBA通常会检查迁移脚本以进行数据库更改,尤其是在跨多个服务和应用程序共享数据库的情况下。


11
是的,永远不要在生产中使用ddl生成。我们使用ddl为表结构生成初始脚本,并使DBA参与此过程。然后,我们将db脚本作为部署单元的一部分,并在部署应用程序时使用Flyway执行它们。当我们需要修改数据库时,我们将新脚本添加到应用程序的下一版本,并部署到暂存。Flyway将自动检测当前版本并运行将数据库更新到最新版本所需的脚本。如果一切正常,我们将部署到生产中。
克劳斯·格伦拜克

1
如果不指定此属性怎么办?例如,我有自己的<bean id =“ sessionFactory” class =“ org.springframework.orm.hibernate5.LocalSessionFactoryBean”> ... ... <prop key =“ hibernate.hbm2ddl.auto”> update </ prop>我有这个出于某种原因,我的表总是被删除,直到添加了上述属性为止;PS:抱歉代码样品)
Ţîgan离子

11
为什么不在validateProduction Env中?
Shamal Karunarathne

20
@ShamalKarunarathne应用程序可以validate在生产中使用,但是通常应该在质量/测试环境中使用该设置,以验证您编写或应用于数据库迁移工具的数据库脚本是否正确。不用于validate生产的另一个原因是,它可能是应用程序启动过程中的瓶颈,特别是如果对象模型的规模很大或其他与网络相关的因素在起作用。
Naros

1
没有精确的堆栈跟踪就很难推测。但是,我的第一个猜测order是SQL解析器对它的解释不正确,因为如果不进行转义,这将是一个关键字。
Naros
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.