spring.jpa.hibernate.hbm2ddl 和 spring.jpa.hibernate.ddl 之间的区别

Posted

技术标签:

【中文标题】spring.jpa.hibernate.hbm2ddl 和 spring.jpa.hibernate.ddl 之间的区别【英文标题】:Difference between spring.jpa.hibernate.hbm2ddl and spring.jpa.hibernate.ddl 【发布时间】:2019-09-27 09:00:45 【问题描述】:

spring.jpa.hibernate.hbm2ddlspring.jpa.hibernate.ddl有什么区别?

我在这个问题中发现:What are the possible values of spring.datasource.initialization-mode? OP 在属性中都使用了这两种方法,但似乎hbm2ddl 的起源是直接休眠而不是 Spring Data Jpa。

尽管如此,从另一个 OP 读取 answer,它看起来只是传递。

但是在我们使用 mariadb 的商业项目中,当我们没有使用 spring.jpa.hibernate.hbm2ddl.auto=create 优雅地关闭我们的 Spring Boot 应用程序时,当应用程序再次运行时,它会删除旧数据并从头开始创建所有内容。另一方面,spring.jpa.hibernate.ddl.auto=create 每秒运行一次(在没有正常关闭应用程序之后)会导致关键约束异常(DB 在创建之前不是 dropper)

【问题讨论】:

【参考方案1】:
    从此Link
默认情况下,仅当您使用嵌入式数据库(H2、HSQL 或 Derby)时,才会自动创建 JPA 数据库。

您可以使用 spring.jpa.* 属性显式配置 JPA 设置。例如,要创建和删除表,您可以将以下行添加到 application.properties:

spring.jpa.hibernate.ddl-auto=create-drop

Hibernate 自己的内部属性名称(如果你碰巧记得更好的话)是hibernate.hbm2ddl.auto

    从此Link

spring.jpa.hibernate.ddl-auto 这实际上是"hibernate.hbm2ddl.auto" 属性的快捷方式。

使用嵌入式数据库且未检测到模式管理器时默认为"create-drop"。否则,默认为"none"

    从此Link

Spring Boot 可以自动创建 DataSource 的模式(DDL 脚本)并初始化它(DML 脚本)。

它从标准根类路径位置加载 SQL:分别为 schema.sqldata.sql

此外,Spring Boot 处理 schema-$platform.sqldata-$platform.sql 文件(如果存在),其中平台是 spring.datasource.platform 的值。

这允许您在必要时切换到特定于数据库的脚本。例如,您可以选择将其设置为数据库的供应商名称(hsqldb、h2、oracle、mysql、postgresql 等)。

【讨论】:

以上是关于spring.jpa.hibernate.hbm2ddl 和 spring.jpa.hibernate.ddl 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章