我真的很想了解有关更新,导出以及可以提供给hibernate.hbm2ddl.auto
的值的更多信息。
我需要知道何时使用更新,何时不使用?还有什么选择?
这些是可能在数据库上发生的更改:
在每种情况下,最佳解决方案是什么?
从社区文档 :
hibernate.hbm2ddl.auto 创建 SessionFactory 时,自动将模式 DDL 验证或导出到数据库。使用 create-drop 时,显式关闭 SessionFactory 时将删除数据库架构。
例如验证 | 更新 | 创建 | 创建放置
因此,可能的选项列表是
这些选项似乎旨在作为开发人员的工具,而不是为了促进任何生产级别的数据库,您可能需要查看以下问题; 休眠:hbm2ddl.auto = 正在生产中更新?
还有一个未记录的值 “none” 可以完全禁用它。
该配置属性称为hibernate.hbm2ddl.auto
在我们的开发环境中,我们将hibernate.hbm2ddl.auto=create-drop
设置为在每次部署时删除并创建一个干净的数据库,以使数据库处于已知状态。
从理论上讲,您可以设置hibernate.hbm2ddl.auto=update
来通过更改模型来更新数据库,但是我不相信在生产数据库上这样做。该文档的早期版本说,这至少是试验性的;我不知道目前的状态。
因此,对于我们的生产数据库,请勿设置hibernate.hbm2ddl.auto
默认为不更改数据库。相反,我们手动创建一个 SQL DDL 更新脚本,该脚本将更改从一个版本应用到下一个版本。
我会使用liquibase更新您的数据库。对于开发人员开发新功能时,hibernate 的模式更新功能确实是可行的。在生产情况下,需要更仔细地处理数据库升级。
尽管这是一篇很老的文章,但是由于我对此主题进行了一些研究,因此想分享它。
hibernate.hbm2ddl.auto
根据文档,它可以具有四个有效值:
创建 | 更新 | 验证创建放置
以下是这些值显示的行为的说明:
以下是值得注意的要点:
Table not found:<table name>
如果我给此属性提供任何值(例如 abc,而不是上面讨论的上述四个值),或者它留为空白。它显示以下行为:
- 如果数据库中不存在模式:- 它创建模式
- 如果数据库中存在模式:- 更新模式。
首先, hbm2ddl
配置属性的可能值为以下值:
none
- 不执行任何操作。该架构将不会生成。 create-only
- 将生成数据库架构。 drop
- 数据库架构将被丢弃后,创造。 create
- 数据库架构将被丢弃后,创造。 create-drop
drop - 之后将删除并创建数据库模式。关闭SessionFactory
,将删除数据库架构。 validate
将使用实体映射来验证数据库模式。 update
- 数据库架构将由现有的数据库模式与实体映射比较进行更新。 我在博客文章中介绍了最常见的Hibernate DDL 生成策略 :
hibernate.hbm2ddl.auto="update"
方便但不灵活。 但是,即使使用 Flyway,仍然可以使用 hbm2ddl 生成初始迁移脚本。在本文中 ,您将看到如何将 JPA 实体模型与 jOOQ 表模型结合起来。
创建 sessionFactory 时, hibernate.hbm2ddl.auto
自动验证 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">
如果您不想在应用程序中使用字符串,并且正在寻找预定义的常量,请查看 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";
validate
:验证模式,数据库没有任何变化。 update
:使用当前执行查询更新架构。 create
:每次创建新的架构,并销毁先前的数据。 create-drop
:在应用程序停止或显式关闭 SessionFactory 时删除架构。