我非常想了解更多有关更新、导出以及可能提供给hibernate.hbm2ddl.auto
的值的信息。
我需要知道什么时候使用更新,什么时候不使用?还有什么替代方案吗?
以下是可能发生在数据库中的更改:
- 新表
- 旧表中的新列
- 删除的列
- 列的数据类型更改
- 更改列属性的类型
- 删除表
- 更改列值
对于每种情况,最好的解决方案是什么?
根据社区文档:
hibernate.hbm2ddl.auto 创建SessionFactory时,自动验证或导出模式DDL到数据库。使用create-drop,当SessionFactory显式关闭时,将删除数据库模式。
例如:验证|更新|创建|创建-删除
可能的选项列表如下:
这些选项似乎是开发人员工具,而不是为了方便任何生产级别的数据库,您可能需要查看以下问题;Hibernate: 在生产环境中hbm2ddl.auto = update?
还有一个值none
,可以完全禁用它。
配置属性称为hibernate.hbm2ddl.auto
在我们的开发环境中,我们将hibernate.hbm2ddl.auto=create-drop
设置为每次部署时删除并创建一个干净的数据库,以便我们的数据库处于已知状态。
理论上,您可以将hibernate.hbm2ddl.auto=update
设置为将更改更新到模型中的数据库,但是我不会相信它对生产数据库的影响。至少,文档的早期版本说这是实验性质的;我不知道当前状态。
因此,在我们的生产数据库中,不要设置hibernate.hbm2ddl.auto
- 默认情况下不进行数据库更改。相反,我们手动创建一个SQL DDL更新脚本,将更改从一版本应用到另一个版本。
hbm2ddl
配置属性的可能值如下:
none
- 不执行任何操作。不会生成模式。create-only
- 将生成数据库模式。drop
- 将删除数据库模式。create
- 将删除数据库模式并在之后创建。create-drop
- 将删除数据库模式并在之后创建。在关闭 SessionFactory
时,将删除数据库模式。validate
- 将使用实体映射验证数据库模式。update
- 将通过比较现有数据库模式与实体映射来更新数据库模式。hibernate.hbm2ddl.auto="update"
是方便但不够灵活,如果您计划添加功能或执行一些自定义脚本,则可以采用最灵活的方法,即使用Flyway。Action
枚举以获取更多详细信息。我猜你正在使用一个非常旧的Hibernate版本。 - Vlad Mihalcea我会使用 Liquibase 来更新您的数据库。Hibernate 的模式更新功能仅适用于开发人员在开发新功能时使用。在生产环境中,数据库升级需要更加谨慎地处理。
虽然这是一个相当古老的帖子,但由于我对该主题进行了一些研究,所以想分享一下。
hibernate.hbm2ddl.auto
根据文档,它可以有四个有效值:
create | update | validate | create-drop
以下是这些值显示的行为的解释:
以下是值得注意的重要点:
Table not found:<table name>
如果我给这个属性赋任何值(比如 abc,而不是上面讨论的四个值)或者将其留空。它会显示以下行为:
- 如果 DB 中不存在模式:它会创建模式
- 如果 DB 中存在模式:更新模式。
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">
如果您不想在应用程序中使用字符串并正在寻找预定义的常量,请查看包含在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时删除模式。