我真的想知道更多有关更新,导出和可以赋予 hibernate.hbm2ddl.auto 的值的更多信息我需要知道何时使用更新,何时不知道?还有什么选择?
hibernate.hbm2ddl.auto
这些是可能在DB上发生的变化:
新表
旧表中的新列
列已删除
列的数据类型已更改
一列的类改变了它的属性
表下降了
列的值已更改
在每种情况下,最佳解决方案是什么?
Since 5.0 ,您现在可以在专用的_271010中找到这些值:org.hibernate.boot.SchemaAutoTooling(自5.2起增强值 NONE ) .
NONE
甚至更好, since 5.1 ,你也可以使用org.hibernate.tool.schema.Action Enum ,它结合了JPA 2和"legacy" Hibernate DDL动作 .
Enum
But ,您无法以编程方式配置 DataSource . 将它与org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO结合使用会更好,但当前代码需要 String 值(摘录自SessionFactoryBuilderImpl):
DataSource
String
this.schemaAutoTooling = SchemaAutoTooling.interpret( (String) configurationSettings.get( AvailableSettings.HBM2DDL_AUTO ) );
... org.hibernate.boot.SchemaAutoTooling和org.hibernate.tool.schema.Action的内部 enum 值未公开显示 .
enum
下面是一个示例程序化的 DataSource 配置(在我的Spring Boot应用程序中使用),它使用了一个gambit,这要归功于 .name().toLowerCase() 但它只适用于没有破折号的值(例如,不是 create-drop ):
.name().toLowerCase()
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(); }
hibernate.hbm2ddl.auto 在创建sessionFactory时自动验证DDL并将其导出到架构 .
默认情况下,它不会在DB上自动执行任何创建或修改 . 如果用户设置以下值之一,则它会自动执行DDL架构更改 .
<entry key="hibernate.hbm2ddl.auto" value="create">
<entry key="hibernate.hbm2ddl.auto" value="update">
<entry key="hibernate.hbm2ddl.auto" value="validate">
<entry key="hibernate.hbm2ddl.auto" value="create-drop">
validate :它验证架构并且不对DB进行任何更改 .假设您已在映射文件中添加了新列并执行了插入操作,它将抛出异常"missing the XYZ column",因为现有模式与您要插入的对象不同 . 如果通过手动添加新列来更改表,然后执行Insert操作,那么它肯定会将所有列和新列一起插入表中 . 表示它不会对现有架构/表进行任何更改/更改 .
validate
update :执行操作时,它会更改数据库中的现有表 . 您可以使用此选项hbm2ddl添加或删除列 . 但是,如果要添加一个'NOT NULL'的新列,则会忽略将该特定列添加到数据库中 . 如果要将'NOT NULL'列添加到现有表,则表必须为空 .
update
从理论上讲,您可以设置hibernate.hbm2ddl.auto = update来更新您的数据库并更改模型,但我不相信它在 生产环境 数据库上 . 文档的早期版本说这至少是实验性的;我不知道目前的状况 .
因此,对于我们的 生产环境 数据库,请不要设置hibernate.hbm2ddl.auto - 默认情况下不进行数据库更改 . 相反,我们手动创建一个SQL DDL更新脚本,该脚本将更改从一个版本应用到下一个版本 .
虽然这是一个相当古老的帖子,但我对这个主题做了一些研究,所以想到分享它 .
根据文档,它可以有四个有效值:
create | update | validate | create-drop
以下是对这些值所示行为的解释:
create: - 创建架构,架构中先前存在的数据(如果有)丢失
update: - 使用给定值更新架构 .
validate: - 验证架构 . 它没有改变数据库 .
create-drop: - 创建模式,销毁先前存在的数据(如果有) . 当SessionFactory关闭时,它也会删除数据库模式 .
以下是值得注意的重点:
如果是 update ,如果数据库中不存在架构,则会创建架构 .
如果是 validate ,如果DB中不存在架构,则不会创建它 . 相反,它会抛出一个错误: - Table not found:<table name>
Table not found:<table name>
如果是 create-drop ,则在关闭会话时不会删除架构 . 它只在关闭SessionFactory时才会丢弃 .
如果我给这个属性赋予任何值(比如abc,而不是上面讨论的上述四个值),或者它只是留空 . 它显示以下行为:
如果数据库中没有架构: - 它会创建架构
如果数据库中存在架构: - update 架构 .
validate:验证模式,不要更改数据库 . 更新:使用当前执行查询更新架构 . create:每次创建新模式,并销毁以前的数据 . create-drop:在应用程序停止或显式关闭SessionFactory时删除架构 .
还有无证件的“无”值完全禁用它 .
配置属性名为 hibernate.hbm2ddl.auto
在我们的开发环境中,我们设置 hibernate.hbm2ddl.auto=create-drop 以在每次部署时删除并创建一个干净的数据库,以便我们的数据库处于已知状态 .
hibernate.hbm2ddl.auto=create-drop
理论上,您可以设置 hibernate.hbm2ddl.auto=update 来更新您的数据库并更改模型,但我不相信它在 生产环境 数据库上 . 文档的早期版本说这至少是实验性的;我不知道目前的状况 .
hibernate.hbm2ddl.auto=update
因此,对于我们的 生产环境 数据库,请不要设置 hibernate.hbm2ddl.auto - 默认情况下不进行数据库更改 . 相反,我们手动创建一个SQL DDL更新脚本,该脚本将更改从一个版本应用到下一个版本 .
如果您不想在应用程序中使用字符串并且正在寻找预定义的常量,请查看Hibernate JAR中包含的 org.hibernate.cfg.AvailableSettings 类,您可以在其中找到所有可能设置的常量 . 以你的情况为例:
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";
我将blog post专门用于最常见的Hibernate DDL生成策略:
如果您计划添加函数或执行一些自定义脚本, hibernate.hbm2ddl.auto="update" 很方便但不太灵活 .
hibernate.hbm2ddl.auto="update"
最灵活的方法是使用Flyway .
但是,即使您使用Flyway,您仍然可以使用hbm2ddl生成初始迁移脚本 . 在this article中,您可以看到如何将JPA实体模型与jOOQ表模型相结合 .
来自community documentation:
hibernate.hbm2ddl.auto创建SessionFactory时,自动验证或将架构DDL导出到数据库 . 使用create-drop,当SessionFactory显式关闭时,将删除数据库模式 . 例如验证|更新|创建|创建降
所以可能的选项列表是,
validate:验证架构,不对数据库进行任何更改 .
update:更新架构 .
create:创建架构,销毁以前的数据 .
create-drop:显式关闭SessionFactory时删除模式,通常是在应用程序停止时 .
这些选项似乎是开发人员工具,而不是为了促进任何 生产环境 级数据库,您可能希望查看以下问题; Hibernate: hbm2ddl.auto=update in production?
我会使用liquibase来更新你的数据库 . hibernate的架构更新功能实际上只是o.k.对于开发人员而言,他们正在开发新功能 . 在 生产环境 环境中,需要更仔细地处理db升级 .
我认为你应该专注于
SchemaExport Class
这个类让你的配置变得动态所以它允许你选择你最好的套房......
结帐[SchemaExport]
13 回答
Since 5.0 ,您现在可以在专用的_271010中找到这些值:org.hibernate.boot.SchemaAutoTooling(自5.2起增强值
NONE
) .甚至更好, since 5.1 ,你也可以使用org.hibernate.tool.schema.Action
Enum
,它结合了JPA 2和"legacy" Hibernate DDL动作 .But ,您无法以编程方式配置
DataSource
. 将它与org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO结合使用会更好,但当前代码需要String
值(摘录自SessionFactoryBuilderImpl):... org.hibernate.boot.SchemaAutoTooling和org.hibernate.tool.schema.Action的内部
enum
值未公开显示 .下面是一个示例程序化的
DataSource
配置(在我的Spring Boot应用程序中使用),它使用了一个gambit,这要归功于.name().toLowerCase()
但它只适用于没有破折号的值(例如,不是create-drop
):hibernate.hbm2ddl.auto
在创建sessionFactory时自动验证DDL并将其导出到架构 .默认情况下,它不会在DB上自动执行任何创建或修改 . 如果用户设置以下值之一,则它会自动执行DDL架构更改 .
validate
:它验证架构并且不对DB进行任何更改 .假设您已在映射文件中添加了新列并执行了插入操作,它将抛出异常"missing the XYZ column",因为现有模式与您要插入的对象不同 . 如果通过手动添加新列来更改表,然后执行Insert操作,那么它肯定会将所有列和新列一起插入表中 . 表示它不会对现有架构/表进行任何更改/更改 .
update
:执行操作时,它会更改数据库中的现有表 . 您可以使用此选项hbm2ddl添加或删除列 . 但是,如果要添加一个'NOT NULL'的新列,则会忽略将该特定列添加到数据库中 . 如果要将'NOT NULL'列添加到现有表,则表必须为空 .从理论上讲,您可以设置hibernate.hbm2ddl.auto = update来更新您的数据库并更改模型,但我不相信它在 生产环境 数据库上 . 文档的早期版本说这至少是实验性的;我不知道目前的状况 .
因此,对于我们的 生产环境 数据库,请不要设置hibernate.hbm2ddl.auto - 默认情况下不进行数据库更改 . 相反,我们手动创建一个SQL DDL更新脚本,该脚本将更改从一个版本应用到下一个版本 .
虽然这是一个相当古老的帖子,但我对这个主题做了一些研究,所以想到分享它 .
hibernate.hbm2ddl.auto
根据文档,它可以有四个有效值:
create | update | validate | create-drop
以下是对这些值所示行为的解释:
create: - 创建架构,架构中先前存在的数据(如果有)丢失
update: - 使用给定值更新架构 .
validate: - 验证架构 . 它没有改变数据库 .
create-drop: - 创建模式,销毁先前存在的数据(如果有) . 当SessionFactory关闭时,它也会删除数据库模式 .
以下是值得注意的重点:
如果是 update ,如果数据库中不存在架构,则会创建架构 .
如果是 validate ,如果DB中不存在架构,则不会创建它 . 相反,它会抛出一个错误: -
Table not found:<table name>
如果是 create-drop ,则在关闭会话时不会删除架构 . 它只在关闭SessionFactory时才会丢弃 .
如果我给这个属性赋予任何值(比如abc,而不是上面讨论的上述四个值),或者它只是留空 . 它显示以下行为:
如果数据库中没有架构: - 它会创建架构
如果数据库中存在架构: - update 架构 .
validate:验证模式,不要更改数据库 . 更新:使用当前执行查询更新架构 . create:每次创建新模式,并销毁以前的数据 . create-drop:在应用程序停止或显式关闭SessionFactory时删除架构 .
还有无证件的“无”值完全禁用它 .
配置属性名为
hibernate.hbm2ddl.auto
在我们的开发环境中,我们设置
hibernate.hbm2ddl.auto=create-drop
以在每次部署时删除并创建一个干净的数据库,以便我们的数据库处于已知状态 .理论上,您可以设置
hibernate.hbm2ddl.auto=update
来更新您的数据库并更改模型,但我不相信它在 生产环境 数据库上 . 文档的早期版本说这至少是实验性的;我不知道目前的状况 .因此,对于我们的 生产环境 数据库,请不要设置
hibernate.hbm2ddl.auto
- 默认情况下不进行数据库更改 . 相反,我们手动创建一个SQL DDL更新脚本,该脚本将更改从一个版本应用到下一个版本 .如果您不想在应用程序中使用字符串并且正在寻找预定义的常量,请查看Hibernate JAR中包含的
org.hibernate.cfg.AvailableSettings
类,您可以在其中找到所有可能设置的常量 . 以你的情况为例:我将blog post专门用于最常见的Hibernate DDL生成策略:
如果您计划添加函数或执行一些自定义脚本,
hibernate.hbm2ddl.auto="update"
很方便但不太灵活 .最灵活的方法是使用Flyway .
但是,即使您使用Flyway,您仍然可以使用hbm2ddl生成初始迁移脚本 . 在this article中,您可以看到如何将JPA实体模型与jOOQ表模型相结合 .
来自community documentation:
所以可能的选项列表是,
validate:验证架构,不对数据库进行任何更改 .
update:更新架构 .
create:创建架构,销毁以前的数据 .
create-drop:显式关闭SessionFactory时删除模式,通常是在应用程序停止时 .
这些选项似乎是开发人员工具,而不是为了促进任何 生产环境 级数据库,您可能希望查看以下问题; Hibernate: hbm2ddl.auto=update in production?
我会使用liquibase来更新你的数据库 . hibernate的架构更新功能实际上只是o.k.对于开发人员而言,他们正在开发新功能 . 在 生产环境 环境中,需要更仔细地处理db升级 .
我认为你应该专注于
这个类让你的配置变得动态所以它允许你选择你最好的套房......
结帐[SchemaExport]