Hibernate hbm2ddl.auto配置的可能值是什么,它们都有什么作用?

1253

我非常想了解更多有关更新、导出以及可能提供给hibernate.hbm2ddl.auto的值的信息。
我需要知道什么时候使用更新,什么时候不使用?还有什么替代方案吗?

以下是可能发生在数据库中的更改:

  • 新表
  • 旧表中的新列
  • 删除的列
  • 列的数据类型更改
  • 更改列属性的类型
  • 删除表
  • 更改列值

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

14个回答

1227

根据社区文档:

hibernate.hbm2ddl.auto 创建SessionFactory时,自动验证或导出模式DDL到数据库。使用create-drop,当SessionFactory显式关闭时,将删除数据库模式。

例如:验证|更新|创建|创建-删除

可能的选项列表如下:

  • validate:验证模式,不更改数据库。
  • create-only:生成数据库创建。
  • drop:生成数据库删除。
  • update:更新模式。
  • create:创建模式,破坏之前的数据。
  • create-drop:当SessionFactory显式关闭(通常在应用程序停止时)时,删除模式。
  • none:不对模式进行任何操作,不更改数据库。

这些选项似乎是开发人员工具,而不是为了方便任何生产级别的数据库,您可能需要查看以下问题;Hibernate: 在生产环境中hbm2ddl.auto = update?


16
只需阅读 Hibernate 文档...寻找有效值,文档中说:“例如”...是否还有其他有效值? - Ta Sas
18
我认为它写“例如”是因为这只是社区文档,如果有人对所有可能的值感兴趣,可以在Hibernate的javadoc中找到它们。(而且,是的,只有这四个选项可用) - szegedi
6
"Validate"的意思是验证,"validate the schema"就是验证模式的意思。具体来说,这个命令要求对给定的模式进行验证,以确定它是否符合规范和标准。 - Hussain Akhtar Wahid 'Ghouri'
9
如果你想让“休眠”功能无效,你也可以使用“aardvark”、“pigeon”或其他任何单词。当然,我并不推荐这样做! - Ward
4
create-drop选项的小改动。如果使用该选项,它不会删除整个模式(schema),而是只会删除那些在运行时具有映射的表格(tables)。例如,如果一个名为S的模式包含A、B、C三个表格,而Java代码仅对A和B进行了映射,则Hibernate将不会删除表格C。 - Aditya
显示剩余8条评论

212

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


10
这实际上非常有用,因为Hibernate的模式验证有时会失败,即使是完全有效的模式。 - Michael Piefel
1
我正想要这样的东西。我的意图是减少启动时间。 - digao_mb
52
“空字符串”比“none”更好。如果使用“none”,你会收到警告信息:org.hibernate.cfg.SettingsFactory - "hibernate.hbm2ddl.auto"的值无法识别:none。 - petertc
18
我已经打了补丁。明确添加了“none”作为有效常量。 - Sanne
11
相比其他选项,我更喜欢“hibernate.hbm2ddl.auto=potato”。https://dev59.com/LHA75IYBdhLWcg3wqK10#15810379 - Sneg
显示剩余2条评论

173

配置属性称为hibernate.hbm2ddl.auto

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

理论上,您可以将hibernate.hbm2ddl.auto=update设置为将更改更新到模型中的数据库,但是我不会相信它对生产数据库的影响。至少,文档的早期版本说这是实验性质的;我不知道当前状态。

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


5
根据文档,create-drop命令会创建数据库表,并在会话工厂被明确关闭时删除这些表。但是它不会在会话工厂被创建时删除这些表。 - Frans
9
不,无论是create-drop还是create都会在sessionfactory创建时创建表格,但create-drop会在sessionfactory关闭时也删除这些表格。请参考https://dev59.com/r1nUa4cB1Zd3GeqPaGUQ#6752698。 - Testo Testini
在生产环境中将hibernate.hbm2ddl.auto设置为create-drop会导致多个连接超时吗? - METTAIBI

108
首先,hbm2ddl配置属性的可能值如下:
  • none - 不执行任何操作。不会生成模式。
  • create-only - 将生成数据库模式。
  • drop - 将删除数据库模式。
  • create - 将删除数据库模式并在之后创建。
  • create-drop - 将删除数据库模式并在之后创建。在关闭 SessionFactory 时,将删除数据库模式。
  • validate - 将使用实体映射验证数据库模式。
  • update - 将通过比较现有数据库模式与实体映射来更新数据库模式。
hibernate.hbm2ddl.auto="update"是方便但不够灵活,如果您计划添加功能或执行一些自定义脚本,则可以采用最灵活的方法,即使用Flyway
然而,即使您使用Flyway,仍然可以使用hbm2ddl生成初始迁移脚本。

“drop” 似乎不是有效的选项。您指的是什么版本的Hibernate? - xagaffar
1
自2016年发布的Hibernate 5.1版本以来,这一选项就已经是有效的选择了。请查看Action枚举以获取更多详细信息。我猜你正在使用一个非常旧的Hibernate版本。 - Vlad Mihalcea
验证和更新之间的确切区别是什么? - Akash Verma
1
答案揭示了差异。 - Vlad Mihalcea

52

我会使用 Liquibase 来更新您的数据库。Hibernate 的模式更新功能仅适用于开发人员在开发新功能时使用。在生产环境中,数据库升级需要更加谨慎地处理。


6
请参阅 https://dev59.com/fHVC5IYBdhLWcg3wpjB8 了解为什么你不应该在生产环境中使用 hbm2ddl。 - Nathan Voxland

51

虽然这是一个相当古老的帖子,但由于我对该主题进行了一些研究,所以想分享一下。

hibernate.hbm2ddl.auto

根据文档,它可以有四个有效值:

create | update | validate | create-drop

以下是这些值显示的行为的解释:

  • create:创建架构,先前存在于架构中的数据(如果有)将丢失
  • update:使用给定的值更新模式。
  • validate:验证架构。它不会更改数据库。
  • create-drop:创建具有销毁以前存在的数据(如果有)的模式。当关闭 SessionFactory 时,它还会删除数据库模式。

以下是值得注意的重要点:

  • update的情况下,如果 DB 中不存在模式,则会创建模式。
  • validate的情况下,如果 DB 中不存在模式,则不会创建模式。相反,它会抛出错误:- Table not found:<table name>
  • create-drop的情况下,模式只有在关闭 SessionFactory 时才会删除。它不会在关闭会话时删除。
  • 如果我给这个属性赋任何值(比如 abc,而不是上面讨论的四个值)或者将其留空。它会显示以下行为:

    - 如果 DB 中不存在模式:它会创建模式

    - 如果 DB 中存在模式:更新模式。


当使用“update”时,如果模式不存在,它确实是一个非常重要的点,将会创建模式。 - yuranos
当比较“行为解释”和“重要点”陈述时,create-drop存在矛盾。 - VNT
2
“update”和“empty”的区别是什么? - yashjain12yj

27

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

默认情况下,它不会自动在数据库上执行任何创建或修改操作。如果用户设置以下值之一,则它将自动执行DDL模式更改。

  • create - 创建模式

    <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">
    

3
<entry key="hibernate.hbm2ddl.auto" value="none"> 的意思是什么? - VNT

18

如果您不想在应用程序中使用字符串并正在寻找预定义的常量,请查看包含在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";

5
为什么在几乎有500个赞的明确回答之上,会引用700多行长的源文件? - Pavel Niedoba
那个问题毫无意义。为什么有事物?我为什么在这里? - specializt

10
  • validate: 验证模式,不会对数据库做出任何更改。
  • update: 更新模式,使用当前执行的查询更新模式。
  • create: 创建新的模式,每次都会销毁之前的数据。
  • create-drop: 在应用程序停止或显式关闭SessionFactory时删除模式。

有没有“官方”文档参考?只是好奇... - Dirk Schumacher

7

我认为你应该集中精力在这个上面

SchemaExport Class 

这个类使您的配置动态化,因此它允许您选择最适合您的内容...请查看[SchemaExport]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接