一尘不染

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

hibernate

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

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

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


阅读 253

收藏
2020-06-20

共1个答案

一尘不染

作为记录,该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通常会检查迁移脚本以进行数据库更改,尤其是在跨多个服务和应用程序共享数据库的情况下。

2020-06-20