[java] Hibernate hbm2ddl.auto可能的值和他们做什么?



5 Answers

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

Question

我真的想知道更多关于更新,导出和可以给hibernate.hbm2ddl.auto的值
我需要知道何时使用更新,何时不使用? 什么是替代方案?

这些是可能发生在数据库上的变化:

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

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




从5.0开始 ,您现在可以在专用Enum找到这些值: org.hibernate.boot.SchemaAutoTooling (自5.2开始,值为NONE增强)。

或者更好, 自5.1以来 ,您还可以使用org.hibernate.tool.schema.Action Enum ,它将JPA 2和“传统”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();
}



我会使用liquibase更新你的数据库。 hibernate的模式更新功能对开发人员来说确实只是在他们开发新功能时才有用。 在生产环境中,数据库升级需要更仔细地处理。




我专门为最常见的Hibernate DDL生成策略撰写 博客文章

  1. 如果您计划添加函数或执行一些自定义脚本, hibernate.hbm2ddl.auto="update"方便但灵活性较低。
  2. 最灵活的方法是使用Flyway

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




hibernate.hbm2ddl.auto在创建sessionFactory时自动验证并将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">
    



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




Related