java Hibernate hbm2ddl.auto可能的值和他们做什么?
我真的想知道更多关于更新,导出和可以给hibernate.hbm2ddl.auto
的值
我需要知道何时使用更新,何时不使用? 什么是替代方案?
这些是可能发生在数据库上的变化:
- 新表格
- 旧表中的新列
- 已删除列
- 列的数据类型已更改
- 一列的类型改变了它的属性
- 表已被删除
- 列的值已更改
在每种情况下,最好的解决方案是什么?
我会使用liquibase更新你的数据库。 hibernate的模式更新功能对开发人员来说确实只是在他们开发新功能时才有用。 在生产环境中,数据库升级需要更仔细地处理。
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">
从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.SchemaAutoTooling
和org.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();
}
验证:验证架构,不会发生数据库更改。 更新:用当前执行的查询更新模式。 创建:每次创建新的模式,并销毁以前的数据。 create-drop:在应用程序停止或显式关闭SessionFactory时删除架构。