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

时间:2017-02-09 11:10:50

标签: spring hibernate jpa database-connection ddl

我正在处理我的Spring启动应用程序项目并注意到,有时在另一台服务器(SQL Server)上的数据库中存在连接超时错误。 当我尝试使用FlyWay进行一些脚本迁移时,会发生这种情况,但是在多次尝试后它都能正常工作。

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

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

2 个答案:

答案 0 :(得分:95)

对于记录,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通常会查看迁移脚本以查找数据库更改,特别是如果您的数据库是跨多个服务和应用程序共享的。

答案 1 :(得分:9)

在 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 根据差异更新模式。即使应用程序不再需要它们,它也不会删除现有的表或列
  • create-drop – 与 create 类似,但 Hibernate 会在所有操作完成后删除数据库。通常用于单元测试
  • validate – Hibernate 只验证表和列是否存在,否则抛出异常
  • none – 该值有效地关闭了 DDL 生成

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