#Hibernate hbm2ddl.auto配置的可能值是什么,它们做了什么

1046 java hibernate hbm2ddl

我真的想知道更多有关更新,导出和可以提供给hibernate.hbm2ddl.auto
我需要知道何时使用更新的值的更多信息,何时不知道?还有什么选择?

这些是可能发生在DB上的变化:

  • 新表
  • 旧表中的新列
  • 列已删除
  • 列的数据类型已更改
  • 列的类型更改了其属性
  • 桌子掉了
  • 列的值已更改

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

Jam*_*hon 1040

来自社区文档:

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

例如验证| 更新| 创建| 创建降

所以可能的选项列表是,

  • validate:验证模式,不对数据库进行任何更改.
  • 更新:更新架构.
  • create:创建架构,销毁以前的数据.
  • create-drop:显式关闭SessionFactory时删除模式,通常是在应用程序停止时.

这些选项似乎是开发人员工具,而不是为了促进任何生产级数据库,您可能想要查看以下问题; Hibernate:hbm2ddl.auto =在生产中更新?

  • 我认为它说"eg"因为它只是一个社区文档,如果有人对所有可能的值感兴趣,可以在Hibernate的javadoc中找到它.(是的,只有这四个选项存在)http://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/cfg/AvailableSettings.html#HBM2DDL_AUTO (16认同)
  • 只需阅读hibernate文档...获取有效值,它会说:"eg"......还有其他有效值吗? (14认同)
  • 如果你想让hibernate什么都不做,你也可以使用'aardvark'或'pigeon'或任何其他词.当然不是我会推荐的! (6认同)
  • validate说验证架构,究竟是什么意思? (4认同)
  • create-drop选项的一小部分内容.如果使用此选项,则不会删除整个架构,而是在运行此选项时删除其映射可用的表.例如,如果具有Schema S的数据库具有A,B,C表和Java代码,则只有A和B的映射,那么Hibernate将不会删除表C. (2认同)

小智 190

还有"无"的无证值可以完全禁用它.

  • **'空字符串'优于'无'**.要使用'none',您将收到警告消息:org.hibernate.cfg.SettingsFactory - "hibernate.hbm2ddl.auto"的无法识别的值:none (45认同)
  • 我打了补丁.添加"none"作为显式有效常量. (13认同)
  • 我比其他人更喜欢"hibernate.hbm2ddl.auto = potato"http://stackoverflow.com/a/15810379/838444 (9认同)
  • 这实际上非常有用,因为Hibernate的模式验证有时会因完全有效的模式而失败. (7认同)

Pet*_*ton 157

调用配置属性 hibernate.hbm2ddl.auto

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

从理论上讲,您可以设置hibernate.hbm2ddl.auto=update通过更改模型来更新数据库,但我不相信生产数据库.文档的早期版本说这至少是实验性的; 我不知道目前的状况.

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

  • 实际上,根据文档,create-drop会创建数据库表,并在显式关闭会话工厂时删除它们.在创建会话工厂时,它不会*删除表. (5认同)
  • 不,创建sessionfactory时create-drop和create都会删除表,然后当sessionfactory关闭时,create-drop也会丢弃表.请参见http://stackoverflow.com/a/6752698/1536382 (4认同)

Pat*_*Pat 51

我会使用liquibase来更新你的数据库.hibernate的架构更新功能在开发人员开发新功能时非常适合.在生产环境中,需要更仔细地处理db升级.

  • 请参阅http://stackoverflow.com/questions/221379/hibernate-hbm2ddl-autoupdate-in-production,了解为何不应将hbm2ddl用于生产. (6认同)

ami*_*mit 44

虽然这是一个相当古老的帖子,但我对这个主题做了一些研究,所以想到分享它.

hibernate.hbm2ddl.auto

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

创建| 更新| 验证| 创建降

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

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

以下是值得注意的重点:

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

    - 如果数据库中没有架构: - 它会创建架构

    - 如果数据库中存在架构: - 更新架构.

  • **更新**和**空**有什么区别? (2认同)

Vla*_*cea 41

我为最常见的Hibernate DDL生成策略撰写一篇博客文章:

  1. hbm2ddl如果您计划添加功能或执行一些自定义脚本,则方便但灵活性较低.
  2. 最灵活的方法是使用迁飞.

但是,即使您使用Flyway,您仍然可以使用hbm2ddl生成初始迁移脚本.在本文中,您可以看到如何将JPA实体模型与jOOQ表模型相结合.


小智 26

hibernate.hbm2ddl.auto 创建sessionFactory时,自动验证DDL并将其导出到架构.

默认情况下,它不会在DB上自动执行任何创建或修改.如果用户设置以下值之一,则它会自动执行DDL架构更改.

  • 那么<entry key ="hibernate.hbm2ddl.auto"value ="none">? (2认同)

Ste*_*erl 17

如果您不想在应用程序中使用字符串并且正在查找预定义常量,请查看org.hibernate.cfg.AvailableSettingsHibernate JAR中包含的类,您可以在其中找到所有可能设置的常量.以你的情况为例:

/**
 * 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";
Run Code Online (Sandbox Code Playgroud)

  • 为什么参考700多行长源文件直接回答近500个vole ups? (5认同)

小智 8

  • validate:验证架构,数据库没有任何变化。
  • update:使用当前的执行查询更新架构。
  • create:每次创建新的架构,并销毁先前的数据。
  • create-drop:在停止应用程序或显式关闭SessionFactory时删除架构。


Vis*_*rma 7

我认为你应该专注于

SchemaExport Class 
Run Code Online (Sandbox Code Playgroud)

这个类让你的配置变得动态所以它允许你选择你最好的套房......

结帐[SchemaExport]