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

我在我的Spring引导应用程序项目中工作,并注意到,有时会有一个连接超时错误到另一个服务器(SQL server)上的数据库。 这种情况特别发生在我尝试用FlyWay做一些脚本迁移时,但它在几次尝试后都能工作。< / p > 然后我注意到我没有在属性文件中指定spring.jpa.hibernate.ddl-auto。我做了一些研究,发现建议添加 spring.jpa.hibernate.ddl-auto= create-drop正在开发中。 在生产环境中将其更改为:spring.jpa.hibernate.ddl-auto= none 但是我实际上不明白它是如何工作的,以及hibernate如何使用create-dropnone值生成数据库模式。您能否从技术上解释一下它是如何工作的,以及在开发和生产服务器上使用此属性的建议是什么? 谢谢你< / p >
383673 次浏览

为了记录,spring.jpa.hibernate.ddl-auto属性是Spring Data JPA特定的,是他们指定值的方式,该值最终将在它所知道的属性hibernate.hbm2ddl.auto下传递给Hibernate。

createcreate-dropvalidateupdate基本上会影响模式工具管理在启动时如何操作数据库模式。

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

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

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

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

在生产环境中,通常强烈建议使用none或直接不指定此属性。这是因为对于dba来说,检查迁移脚本以更改数据库是一种常见的做法,特别是如果您的数据库是跨多个服务和应用程序共享的。

在Spring/Spring- boot中,SQL数据库可以以不同的方式初始化,这取决于您的堆栈是什么。

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

  • spring.jpa.generate-ddl(布尔值)开启和关闭该特性,并且与供应商无关。
  • spring.jpa.hibernate.ddl-auto (enum)是一个Hibernate特性,它以更细粒度的方式控制行为。详情见下文。

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

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

在Spring Boot内部,如果没有检测到模式管理器,该参数值默认为create-drop,否则所有其他情况都不设置。

“spring.jpa.hibernate.ddl-auto = create-drop"意味着当服务器运行时,将创建数据库(表)实例。只要服务器停止,数据库表实例就会被删除。