我真的想知道更多关于更新,导出和值,可以给hibernate.hbm2ddl.auto 我需要知道什么时候使用更新,什么时候不?另一种选择是什么?

以下是在DB中可能发生的变化:

新表 旧表中的新列 列删除 事件解释列的数据类型发生变化 列的类型更改了其属性 表了 事件解释列值发生变化

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


当前回答

我会使用liquibase来更新您的数据库。Hibernate的模式更新特性实际上只适用于开发新特性的开发人员。在生产环境中,需要更谨慎地处理db升级。

其他回答

配置属性称为hibernate.hbm2ddl.auto

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

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

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

还有一个值none可以完全禁用它。

我觉得你应该集中精力

SchemaExport Class 

这个类使你的配置动态 所以它可以让你选择你最喜欢的套间…

结帐 [架构导出]

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

默认情况下,不会自动对DB进行任何创建或修改。如果用户设置了以下值之一,那么它将自动进行DDL模式更改。

创建—正在创建模式 <输入键= " hibernate.hbm2ddl。汽车“价值= "创建" > 更新——更新现有的模式 <输入键= " hibernate.hbm2ddl。汽车“价值= "更新" > 验证—验证现有的模式 <输入键= " hibernate.hbm2ddl。汽车“价值= "验证" > 创建-删除—在会话开始和结束时自动创建和删除模式 <输入键= " hibernate.hbm2ddl。汽车“价值= " create-drop " >

从5.0开始,您现在可以在专用Enum: org.hibernate.boot. schemaauto工装中找到这些值(从5.2开始使用值NONE进行了增强)。

或者更好的是,从5.1开始,您还可以使用org.hibernate.tool.schema.Action Enum,它结合了JPA 2和“遗留的”Hibernate DDL操作。

但是,您还不能用它以编程方式配置数据源。与org.hibernate.cfg结合使用会更好。AvailableSettings#HBM2DDL_AUTO但是当前代码期望一个String值(摘自SessionFactoryBuilderImpl):

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

和org.hibernate.boot. schemaautotooling和org.hibernate.tool.schema.Action的内部enum值都没有公开。

以下是一个示例编程数据源配置(在我的Spring Boot应用程序中使用),它使用了.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();
}