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

How does spring.jpa.hibernate.ddl-auto property exactly work in Spring?

我在处理我的 Spring 引导应用程序项目时注意到,有时我在另一台服务器(SQL 服务器)上的数据库会出现连接超时错误。 当我尝试使用 FlyWay 进行一些脚本迁移时特别会发生这种情况,但在多次尝试后它会起作用。

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

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

郑重声明,spring.jpa.hibernate.ddl-auto 属性 是 Spring Data JPA 特定的,是他们指定最终将在 [=41= 下传递给 Hibernate 的值的方式] 它知道,hibernate.hbm2ddl.auto.

createcreate-dropvalidateupdate 主要影响模式工具管理在启动时如何操作数据库模式。

例如,update 操作将查询 JDBC 驱动程序的 API 以获取数据库元数据,然后 Hibernate 根据读取您的注释 类 或 HBM XML 映射,并将尝试调整架构 on-the-fly。

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

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

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

在生产中,通常强烈建议您使用 none 或者干脆不指定此 属性。这是因为 DBA 检查数据库更改的迁移脚本是常见的做法,尤其是当您的数据库在多个服务和应用程序之间共享时。

在 Spring/Spring-Boot 中,SQL 数据库可以根据您的堆栈以不同的方式初始化。

JPA 具有 DDL 生成功能,这些功能可以在针对数据库启动时设置为 运行。这是通过两个外部属性控制的:

  • spring.jpa.generate-ddl(布尔值)打开和关闭该功能并且与供应商无关。
  • spring.jpa.hibernate.ddl-auto(枚举)是一种以更细粒度的方式控制行为的 Hibernate 功能。详情见下文。

Hibernate 属性 值为:create、update、create-drop、validate 和 none:

  • 创建 – Hibernate 首先删除现有表,然后创建新表
  • update – 将基于映射(注释或XML)创建的对象模型与现有模式进行比较,然后 Hibernate 根据差异更新模式。它永远不会删除现有的表或列,即使应用程序不再需要它们
  • create-drop – 类似于create,只是Hibernate会在所有操作完成后drop数据库。通常用于单元测试
  • validate – Hibernate 只验证表和列是否存在,否则抛出异常
  • none – 该值有效地关闭了 DDL 生成

Spring 如果未检测到模式管理器,引导内部默认此参数值为 create-drop,否则 none 对于所有其他情况。

"spring.jpa.hibernate.ddl-auto=create-drop"表示当服务器为运行时,创建数据库(table)实例。每当服务器停止时,数据库 table 实例就会被删除。