我真的想知道更多关于更新,导出和值,可以给hibernate.hbm2ddl.auto 我需要知道什么时候使用更新,什么时候不?另一种选择是什么?
以下是在DB中可能发生的变化:
新表 旧表中的新列 列删除 事件解释列的数据类型发生变化 列的类型更改了其属性 表了 事件解释列值发生变化
在每种情况下,最佳解决方案是什么?
我真的想知道更多关于更新,导出和值,可以给hibernate.hbm2ddl.auto 我需要知道什么时候使用更新,什么时候不?另一种选择是什么?
以下是在DB中可能发生的变化:
新表 旧表中的新列 列删除 事件解释列的数据类型发生变化 列的类型更改了其属性 表了 事件解释列值发生变化
在每种情况下,最佳解决方案是什么?
当前回答
给任何人搜索默认值…
它是在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;
其他回答
虽然这是一个相当老的帖子,但我做了一些关于这个话题的研究,所以我想分享它。
auto
根据文档,它可以有四个有效值:
创建|更新|验证| Create -drop
以下是对这些值所显示的行为的解释:
创建:—创建模式,之前在模式中出现的数据(如果有)将丢失 更新:用给定的值更新模式。 Validate:—验证模式。它对DB没有任何改变。 create-drop:创建模式时销毁之前存在的数据(如果有的话)。它还在SessionFactory关闭时删除数据库模式。
以下是值得注意的要点:
In case of update, if schema is not present in the DB then the schema is created. In case of validate, if schema does not exists in DB, it is not created. Instead, it will throw an error:- Table not found:<table name> In case of create-drop, schema is not dropped on closing the session. It drops only on closing the SessionFactory. In case if i give any value to this property(say abc, instead of above four values discussed above) or it is just left blank. It shows following behaviour: -If schema is not present in the DB:- It creates the schema -If schema is present in the DB:- update the schema.
配置属性称为hibernate.hbm2ddl.auto
在我们的开发环境中,我们设置hibernate.hbm2ddl。Auto =create-drop to drop并在每次部署时创建一个干净的数据库,以便我们的数据库处于已知状态。
理论上,您可以设置hibernate.hbm2ddl。auto=update用于更新数据库,对模型进行更改,但我不相信在生产数据库上这样做。早期版本的文档说,这至少是实验性的;我不知道目前的情况。
因此,对于我们的生产数据库,不要设置hibernate.hbm2ddl。自动-默认是不进行数据库更改。相反,我们手动创建一个SQL DDL更新脚本,将一个版本的更改应用到下一个版本。
还有一个值none可以完全禁用它。
我觉得你应该集中精力
SchemaExport Class
这个类使你的配置动态 所以它可以让你选择你最喜欢的套间…
结帐 [架构导出]
从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();
}