首页 文章

Hibernate hbm2ddl.auto可能的值和它们的作用是什么?

提问于
浏览
946

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

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

  • 新表

  • 旧表中的新列

  • 列已删除

  • 列的数据类型已更改

  • 一列的类改变了它的属性

  • 表下降了

  • 列的值已更改

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

13 回答

  • 953

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

    甚至更好, since 5.1 ,你也可以使用org.hibernate.tool.schema.Action Enum ,它结合了JPA 2和"legacy" Hibernate DDL动作 .

    But ,您无法以编程方式配置 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应用程序中使用),它使用了一个gambit,这要归功于 .name().toLowerCase() 但它只适用于没有破折号的值(例如,不是 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();
    }
    
  • 7

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

    默认情况下,它不会在DB上自动执行任何创建或修改 . 如果用户设置以下值之一,则它会自动执行DDL架构更改 .

    • create - 创建模式
    <entry key="hibernate.hbm2ddl.auto" value="create">
    
    • update - 更新现有架构
    <entry key="hibernate.hbm2ddl.auto" value="update">
    
    • validate - 验证现有架构
    <entry key="hibernate.hbm2ddl.auto" value="validate">
    
    • create-drop - 在会话开始和结束时自动创建和删除架构
    <entry key="hibernate.hbm2ddl.auto" value="create-drop">
    
  • 17

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

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

  • 171

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

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

  • 50

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

    hibernate.hbm2ddl.auto

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

    create | update | validate | create-drop

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

    • create: - 创建架构,架构中先前存在的数据(如果有)丢失

    • update: - 使用给定值更新架构 .

    • validate: - 验证架构 . 它没有改变数据库 .

    • create-drop: - 创建模式,销毁先前存在的数据(如果有) . 当SessionFactory关闭时,它也会删除数据库模式 .

    以下是值得注意的重点:

    • 如果是 update ,如果数据库中不存在架构,则会创建架构 .

    • 如果是 validate ,如果DB中不存在架构,则不会创建它 . 相反,它会抛出一个错误: - Table not found:<table name>

    • 如果是 create-drop ,则在关闭会话时不会删除架构 . 它只在关闭SessionFactory时才会丢弃 .

    • 如果我给这个属性赋予任何值(比如abc,而不是上面讨论的上述四个值),或者它只是留空 . 它显示以下行为:

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

    • 如果数据库中存在架构: - update 架构 .

  • 29

    validate:验证模式,不要更改数据库 . 更新:使用当前执行查询更新架构 . create:每次创建新模式,并销毁以前的数据 . create-drop:在应用程序停止或显式关闭SessionFactory时删除架构 .

  • 3

    还有无证件的“无”值完全禁用它 .

  • 144

    配置属性名为 hibernate.hbm2ddl.auto

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

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

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

  • 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";
    
  • 23

    我将blog post专门用于最常见的Hibernate DDL生成策略:

    • 如果您计划添加函数或执行一些自定义脚本, hibernate.hbm2ddl.auto="update" 很方便但不太灵活 .

    • 最灵活的方法是使用Flyway .

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

  • 4

    来自community documentation

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

    所以可能的选项列表是,

    • validate:验证架构,不对数据库进行任何更改 .

    • update:更新架构 .

    • create:创建架构,销毁以前的数据 .

    • create-drop:显式关闭SessionFactory时删除模式,通常是在应用程序停止时 .

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

  • -5

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

  • 2

    我认为你应该专注于

    SchemaExport Class
    

    这个类让你的配置变得动态所以它允许你选择你最好的套房......

    结帐[SchemaExport]

相关问题