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

时间:2009-01-13 06:40:49

标签: java hibernate hbm2ddl

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

这些可能发生在DB上的变化:

  • 新表
  • 旧表中的新列
  • 列已删除
  • 列的数据类型已更改
  • 一种列的类型更改了其属性
  • 表格已删除
  • 列的值已更改

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

13 个答案:

答案 0 :(得分:1000)

来自community documentation

  

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

     

e.g。验证|更新|创建| create-drop

所以可能的选项列表是,

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

这些选项似乎是开发人员工具,而不是为了促进任何生产级数据库,您可能希望查看以下问题; Hibernate: hbm2ddl.auto=update in production?

答案 1 :(得分:185)

还有“无”的无证值可以完全禁用它。

答案 2 :(得分:149)

配置属性称为hibernate.hbm2ddl.auto

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

理论上,您可以将hibernate.hbm2ddl.auto=update设置为使用模型更改来更新数据库,但我不相信生产数据库。文档的早期版本说这至少是实验性的;我不知道目前的状况。

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

答案 3 :(得分:51)

我会使用liquibase更新您的数据库。 hibernate的架构更新功能实际上只是o.k.对于开发人员而言,他们正在开发新功能。在生产环境中,需要更仔细地处理db升级。

答案 4 :(得分:38)

虽然这是一个相当古老的帖子,但我对这个主题做了一些研究,所以想到分享它。

<强> hibernate.hbm2ddl.auto

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

创建|更新|验证|创建降

以下是对这些值所示行为的解释:

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

以下是值得注意的重点:

  • 如果 更新 ,如果数据库中不存在架构,则会创建架构。
  • 如果 验证 ,如果数据库中不存在架构,则不会创建架构。相反,它会抛出错误: - tkinter.Button(text="/").grid(row=1, column=3)
  • 如果是 create-drop ,则关闭会话时不会删除架构。它仅在关闭SessionFactory时才会下降。
  • 如果我给这个属性赋予任何值(比如abc,而不是上面讨论的上述四个值),或者它只是留空。它显示以下行为:

    - 如果数据库中没有架构: - 它会创建架构

    - 如果数据库中存在架构: - 更新 架构。

答案 5 :(得分:23)

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

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

我为最常见的 Hibernate DDL生成策略提供了blog post

  1. 如果您计划添加函数或执行某些自定义脚本,hibernate.hbm2ddl.auto="update"很方便但不太灵活。
  2. 最灵活的方法是使用Flyway
  3. 但是,即使您使用Flyway,您仍然可以使用hbm2ddl生成初始迁移脚本。在this article中,您可以看到如何将JPA实体模型与jOOQ表模型相结合。

答案 6 :(得分:16)

如果您不想在应用中使用字符串并且正在查找预定义的常量,请查看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";

答案 7 :(得分:7)

我认为你应该专注于

SchemaExport Class 

此类使您的配置动态化 因此,它允许您选择最适合的套房......

结帐[SchemaExport]

答案 8 :(得分:5)

  • validate:验证架构,数据库不会发生任何变化。
  • update:使用当前执行查询更新架构。
  • create:每次都创建新架构,并销毁以前的数据。
  • create-drop:在应用程序停止或显式关闭SessionFactory时删除架构。

答案 9 :(得分:4)

validate:它验证架构并且不对DB进行任何更改 假设您已在映射文件中添加了一个新列并执行了插入操作,它将抛出异常“缺少XYZ列”,因为现有模式与您要插入的对象不同。如果通过手动添加新列来更改表,然后执行Insert操作,那么它肯定会将所有列和新列一起插入表中。 表示它不会对现有架构/表进行任何更改/更改。

update:执行操作时,它会更改数据库中的现有表。 您可以使用此选项hbm2ddl添加或删除列。 但是,如果要添加一个“非空”的新列,则会忽略将该特定列添加到数据库中。因为如果要向现有表添加“NOT NULL”列,则表必须为空。

答案 10 :(得分:3)

自5.0 以来,您现在可以在专用Enum中找到这些值:org.hibernate.boot.SchemaAutoTooling(自5.2起以来增值NONE。)

甚至更好,自5.1 ,您还可以使用结合了JPA 2和&#34;遗产&#34;的org.hibernate.tool.schema.Action Enum。 Hibernate DDL操作。

但是,您还无法以编程方式配置DataSource。结合org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO使用它会更好,但当前代码需要String值(摘录自SessionFactoryBuilderImpl):

this.schemaAutoTooling = SchemaAutoTooling.interpret( (String) configurationSettings.get( AvailableSettings.HBM2DDL_AUTO ) );

... org.hibernate.boot.SchemaAutoToolingorg.hibernate.tool.schema.Action的内部enum值未公开曝光。

下面是一个示例程序化DataSource配置(在我的Spring Boot应用程序中使用),由于.name().toLowerCase()而使用了一个gambit,但它只适用于没有破折号的值(不是create-drop例如):

@Bean(name = ENTITY_MANAGER_NAME)
public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
        EntityManagerFactoryBuilder builder,
        @Qualifier(DATA_SOURCE_NAME) DataSource internalDataSource) {

    Map<String, Object> properties = new HashMap<>();
    properties.put(AvailableSettings.HBM2DDL_AUTO, SchemaAutoTooling.CREATE.name().toLowerCase());
    properties.put(AvailableSettings.DIALECT, H2Dialect.class.getName());

    return builder
            .dataSource(internalDataSource)
            .packages(JpaModelsScanEntry.class, Jsr310JpaConverters.class)
            .persistenceUnit(PERSISTENCE_UNIT_NAME)
            .properties(properties)
            .build();
}

答案 11 :(得分:1)

搜索默认值的人...

它是用spring-boot的2.0.5版本和JpaProperties的1.1.0的源代码编写的:

    /**
     * DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto"
     * property. Defaults to "create-drop" when using an embedded database and no
     * schema manager was detected. Otherwise, defaults to "none".
     */
    private String ddlAuto;

答案 12 :(得分:-6)

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

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