Hibernate hbm2ddl.auto 配置的可能值是什么,它们做什么?

我真的很想了解有关更新,导出以及可以提供给hibernate.hbm2ddl.auto的值的更多信息。
我需要知道何时使用更新,何时不使用?还有什么选择?

这些是可能在数据库上发生的更改:

  • 新表
  • 旧表中的新列
  • 列已删除
  • 列的数据类型已更改
  • 列的类型更改了其属性
  • 桌子掉了
  • 列的值已更改

在每种情况下,最佳解决方案是什么?

答案

社区文档

hibernate.hbm2ddl.auto 创建 SessionFactory 时,自动将模式 DDL 验证或导出到数据库。使用 create-drop 时,显式关闭 SessionFactory 时将删除数据库架构。

例如验证 | 更新 | 创建 | 创建放置

因此,可能的选项列表是

  • validate :验证模式,不对数据库进行任何更改。
  • update :更新架构。
  • create :创建模式,销毁先前的数据。
  • create-drop :在显式关闭 SessionFactory 时(通常是在应用程序停止时),删除架构。

这些选项似乎旨在作为开发人员的工具,而不是为了促进任何生产级别的数据库,您可能需要查看以下问题; 休眠:hbm2ddl.auto = 正在生产中更新?

还有一个未记录的值 “none” 可以完全禁用它。

该配置属性称为hibernate.hbm2ddl.auto

在我们的开发环境中,我们将hibernate.hbm2ddl.auto=create-drop设置为在每次部署时删除并创建一个干净的数据库,以使数据库处于已知状态。

从理论上讲,您可以设置hibernate.hbm2ddl.auto=update来通过更改模型来更新数据库,但是我不相信在生产数据库上这样做。该文档的早期版本说,这至少是试验性的;我不知道目前的状态。

因此,对于我们的生产数据库,请勿设置hibernate.hbm2ddl.auto默认为不更改数据库。相反,我们手动创建一个 SQL DDL 更新脚本,该脚本将更改从一个版本应用到下一个版本。

我会使用liquibase更新您的数据库。对于开发人员开发新功能时,hibernate 的模式更新功能确实是可行的。在生产情况下,需要更仔细地处理数据库升级。

尽管这是一篇很老的文章,但是由于我对此主题进行了一些研究,因此想分享它。

hibernate.hbm2ddl.auto

根据文档,它可以具有四个有效值:

创建 | 更新 | 验证创建放置

以下是这些值显示的行为的说明:

  • create :- 创建模式,该模式中先前存在的数据(如果存在)将丢失
  • 更新:- 使用给定的值更新架构。
  • 验证:- 验证架构。它不会更改数据库。
  • create-drop:- 通过销毁先前存在的数据(如果存在)来创建模式。当 SessionFactory 关闭时,它也会删除数据库架构。

以下是值得注意的要点:

  • update 的情况下,如果数据库中不存在架构,则会创建该架构。
  • 对于validate ,如果模式在数据库中不存在,则不会创建它。相反,它将引发错误:- Table not found:<table name>
  • create-drop 的情况下,关闭会话时不会删除架构。它仅在关闭 SessionFactory 时下降。
  • 如果我给此属性提供任何值(例如 abc,而不是上面讨论的上述四个值),或者它留为空白。它显示以下行为:

    - 如果数据库中不存在模式:- 它创建模式

    - 如果数据库中存在模式:- 更新模式。

首先, hbm2ddl配置属性的可能值为以下值:

  • none - 不执行任何操作。该架构将不会生成。
  • create-only - 将生成数据库架构。
  • drop - 数据库架构将被丢弃后,创造。
  • create - 数据库架构将被丢弃后,创造。
  • create-drop drop - 之后将删除并创建数据库模式。关闭SessionFactory ,将删除数据库架构。
  • validate将使用实体映射来验证数据库模式。
  • update - 数据库架构将由现有的数据库模式与实体映射比较进行更新。

我在博客文章中介绍了最常见的Hibernate DDL 生成策略

  1. 如果您打算添加功能或执行一些自定义脚本,则hibernate.hbm2ddl.auto="update"方便但不灵活。
  2. 最灵活的方法是使用Flyway

但是,即使使用 Flyway,仍然可以使用 hbm2ddl 生成初始迁移脚本。在本文中 ,您将看到如何将 JPA 实体模型与 jOOQ 表模型结合起来。

创建 sessionFactory 时, hibernate.hbm2ddl.auto自动验证 DDL 并将其导出到架构。

默认情况下,它不会在数据库上自动执行任何创建或修改。如果用户设置以下值之一,则表示正在执行 DDL 模式更改。

  • 创建 - 正在创建模式

    <entry key="hibernate.hbm2ddl.auto" value="create">
  • 更新 - 更新现有架构

    <entry key="hibernate.hbm2ddl.auto" value="update">
  • 验证 - 验证现有架构

    <entry key="hibernate.hbm2ddl.auto" value="validate">
  • create-drop - 在会话开始和结束时自动创建和删除模式

    <entry key="hibernate.hbm2ddl.auto" value="create-drop">

如果您不想在应用程序中使用字符串,并且正在寻找预定义的常量,请查看 Hibernate JAR 中包含的org.hibernate.cfg.AvailableSettings类,您将在其中找到所有可能设置的常量。以您的情况为例:

/**
 * Auto export/update schema using hbm2ddl tool. Valid values are <tt>update</tt>,
 * <tt>create</tt>, <tt>create-drop</tt> and <tt>validate</tt>.
 */
String HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
  • validate :验证模式,数据库没有任何变化。
  • update :使用当前执行查询更新架构。
  • create :每次创建新的架构,并销毁先前的数据。
  • create-drop :在应用程序停止或显式关闭 SessionFactory 时删除架构。

我认为您应该专注于

SchemaExport Class

此类使您的配置动态化,因此它使您可以选择最佳的套件...

结帐[SchemaExport]