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

MET*_*IBI 75 ddl spring hibernate database-connection jpa

实际上我正在开发我的Spring启动应用程序项目,我注意到有时在另一台服务器(SQL Server)上的数据库连接超时,特别是当我尝试使用FlyWay进行一些脚本迁移时,但是尝试.我注意到我没有在我的属性中指定FlyWay.然后我做了一些研究,发现建议加入 spring.jpa.hibernate.ddl-auto开发.并将其改为:spring.jpa.hibernate.ddl-auto= create-drop生产中.但我实际上并没有理解它是如何工作的,以及hibernate如何生成数据库模式,创建值或使用none.您能否从技术上解释它是如何工作的,以及在开发和生产服务器中使用此属性的建议是什么.谢谢

Nar*_*ros 137

对于记录,该spring.jpa.hibernate.ddl-auto属性是特定于Spring Data JPA的,并且是指定最终将在其知道的属性下传递给Hibernate的值的方式hibernate.hbm2ddl.auto.

create,create-drop,validate,和update基本上影响架构管理工具将如何处理在启动数据库模式.

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

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

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

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

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

  • @ShamalKarunarathne应用程序可以在生产中使用`validate`,但通常应该是您在质量/测试环境中使用的设置,以验证您编写或应用于数据库迁移工具的数据库脚本是否准确.在生产中不使用`validate`的另一个原因是它可能是应用程序启动过程中的瓶颈,特别是如果您的对象模型的大小非常广泛或者其他网络相关因素发挥作用. (9认同)
  • 是的,永远不要在生产中使用ddl代.我们使用ddl为表结构生成初始脚本,并在此过程中涉及DBA.然后,我们将db脚本作为部署单元的一部分包含在内,并在部署应用程序时使用Flyway执行它们.当我们需要修改数据库时,我们将新脚本添加到下一版本的应用程序并部署到staging.Flyway将自动检测当前版本并运行使数据库升级到最新版本所需的脚本.如果一切正常,我们将部署到生产. (4认同)
  • 如果我们不指定这个属性怎么办?例如我有我自己的 <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> ... <prop key="hibernate.hbm2ddl.auto">update</prop> 我有这个出于某种原因,我的表总是被删除,直到我添加了上述属性;;ps:抱歉代码示例) (2认同)
  • 为什么不在Production Env中“验证”? (2认同)

Md.*_*bib 17

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

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

  • spring.jpa.generate-ddl (boolean) 打开和关闭该功能并且独立于供应商。
  • 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,否则对于所有其他情况都没有。


ker*_*ter 12

还取决于spring.jpa.hibernate.ddl-autoDML 文件功能是否启用

DDL 和 DML

值得了解它们之间的区别。

  • 数据定义语言(DDL) - 与数据库模式创建相关
  • 数据操作语言(DML) - 与导入数据相关

基本上有 3 种类型的数据库模式创建(DDL)和导入数据(DML):

  • 使用休眠
  • 使用 Spring JDBC SQL 脚本
  • 使用 Flyway/Liquibase 等高级工具

本主题涵盖 Hibernate 及其 DDL(第一个选项),但值得一提的是 Hibernate DML 文件功能,该功能启用 if spring.jpa.hibernate.ddl-autoiscreatecreate-drop

这意味着import.sql类路径的根目录中将由 Hibernate 在启动时执行。如果您小心的话,这对于演示和测试很有用,但可能不是您希望在生产中的类路径中出现的东西。这是一个 Hibernate 功能(与 Spring 无关)。

这里还有一个表格,解释了spring.jpa.hibernate.ddl-auto是否import.sql可以根据spring.jpa.hibernate.ddl-auto指定的值使用:

spring.jpa.hibernate.ddl-auto 从实体创建模式 导入.sql
创造 真的 真的
更新 从实体更新架构 错误的
创建-删除 真的 真的
证实 错误的 错误的
没有任何 错误的 错误的

另外,有关不同类型的 DDL 和 DML 的一些额外信息可以在 Spring 文档中找到