我真的想了解有关更新,导出以及可以赋予hibernate.hbm2ddl.auto
的值的更多信息
我需要知道何时使用更新,何时不知道?还有什么选择?
这些可能发生在DB上的变化:
在每种情况下,最佳解决方案是什么?
答案 0 :(得分:1000)
hibernate.hbm2ddl.auto创建SessionFactory时,自动验证或将架构DDL导出到数据库。使用create-drop,当SessionFactory显式关闭时,将删除数据库模式。
e.g。验证|更新|创建| create-drop
所以可能的选项列表是,
这些选项似乎是开发人员工具,而不是为了促进任何生产级数据库,您可能希望查看以下问题; Hibernate: hbm2ddl.auto=update in production?
答案 1 :(得分:185)
还有“无”的无证值可以完全禁用它。
答案 2 :(得分:149)
配置属性称为hibernate.hbm2ddl.auto
在我们的开发环境中,我们将hibernate.hbm2ddl.auto=create-drop
设置为在每次部署时删除并创建一个干净的数据库,以便我们的数据库处于已知状态。
理论上,您可以将hibernate.hbm2ddl.auto=update
设置为使用模型更改来更新数据库,但我不相信生产数据库。文档的早期版本说这至少是实验性的;我不知道目前的状况。
因此,对于我们的生产数据库,请不要设置hibernate.hbm2ddl.auto
- 默认情况下不进行数据库更改。相反,我们手动创建一个SQL DDL更新脚本,将一个版本的更改应用到下一个版本。
答案 3 :(得分:51)
我会使用liquibase更新您的数据库。 hibernate的架构更新功能实际上只是o.k.对于开发人员而言,他们正在开发新功能。在生产环境中,需要更仔细地处理db升级。
答案 4 :(得分:38)
虽然这是一个相当古老的帖子,但我对这个主题做了一些研究,所以想到分享它。
<强> hibernate.hbm2ddl.auto 强>
根据文档,它可以有四个有效值:
创建|更新|验证|创建降 强>
以下是对这些值所示行为的解释:
以下是值得注意的重点:
tkinter.Button(text="/").grid(row=1, column=3)
如果我给这个属性赋予任何值(比如abc,而不是上面讨论的上述四个值),或者它只是留空。它显示以下行为:
- 如果数据库中没有架构: - 它会创建架构
- 如果数据库中存在架构: - 更新 架构。
答案 5 :(得分:23)
首先,hbm2ddl
配置属性的可能值如下:
none
- 未执行任何操作。将不会生成架构。create-only
- 将生成数据库架构。drop
- 之后将删除并创建数据库架构。create
- 之后将删除并创建数据库架构。create-drop
- 之后将删除并创建数据库架构。关闭SessionFactory
后,将删除数据库架构。validate
- 将使用实体映射验证数据库架构。update
- 将通过将现有数据库架构与实体映射进行比较来更新数据库架构。我为最常见的 Hibernate DDL生成策略提供了blog post :
hibernate.hbm2ddl.auto="update"
很方便但不太灵活。 但是,即使您使用Flyway,您仍然可以使用hbm2ddl生成初始迁移脚本。在this article中,您可以看到如何将JPA实体模型与jOOQ表模型相结合。
答案 6 :(得分: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";
答案 7 :(得分:7)
答案 8 :(得分:5)
validate
:验证架构,数据库不会发生任何变化。update
:使用当前执行查询更新架构。create
:每次都创建新架构,并销毁以前的数据。create-drop
:在应用程序停止或显式关闭SessionFactory时删除架构。答案 9 :(得分:4)
validate
:它验证架构并且不对DB进行任何更改
假设您已在映射文件中添加了一个新列并执行了插入操作,它将抛出异常“缺少XYZ列”,因为现有模式与您要插入的对象不同。如果通过手动添加新列来更改表,然后执行Insert操作,那么它肯定会将所有列和新列一起插入表中。
表示它不会对现有架构/表进行任何更改/更改。
update
:执行操作时,它会更改数据库中的现有表。
您可以使用此选项hbm2ddl添加或删除列。
但是,如果要添加一个“非空”的新列,则会忽略将该特定列添加到数据库中。因为如果要向现有表添加“NOT NULL”列,则表必须为空。
答案 10 :(得分:3)
自5.0 以来,您现在可以在专用Enum
中找到这些值:org.hibernate.boot.SchemaAutoTooling
(自5.2起以来增值NONE
。)
甚至更好,自5.1 ,您还可以使用结合了JPA 2和&#34;遗产&#34;的org.hibernate.tool.schema.Action
Enum
。 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();
}
答案 11 :(得分:1)
搜索默认值的人...
它是用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;
答案 12 :(得分:-6)
理论上,您可以设置hibernate.hbm2ddl.auto = update来更新您的数据库并更改您的模型,但我不相信它在生产数据库上。文档的早期版本说这至少是实验性的;我不知道目前的状况。
因此,对于我们的生产数据库,请不要设置hibernate.hbm2ddl.auto - 默认情况下不进行数据库更改。相反,我们手动创建一个SQL DDL更新脚本,将一个版本的更改应用到下一个版本。