Hibernatehbm2ddl.auto配置的可能值是什么?

我真的想知道更多关于更新,导出和可以给hibernate.hbm2ddl.auto的值
我需要知道什么时候使用更新,什么时候不使用?替代方案是什么?

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

  • 新表
  • 旧表中的新列
  • 删除的列
  • 列的数据类型已更改
  • 列的类型改变了它的属性
  • 表下降
  • 列的值已更改

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

1237346 次浏览

配置属性称为hibernate.hbm2ddl.auto

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

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

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

我将使用液基来更新您的数据库。hibernate的模式更新功能实际上只有开发人员在开发新功能时才可以。在生产环境中,需要更仔细地处理数据库升级。

社区留档

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

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

所以可能的选项列表是,

  • 验证:验证架构,不更改数据库。
  • 更新:更新架构。
  • 创建:创建架构,销毁以前的数据。
  • 创建-删除:当SessionFactory显式关闭时删除架构,通常是在应用程序停止时。
  • 没有:对模式不做任何事情,对数据库不做任何更改

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

还有“无”的未记录值可以完全禁用它。

我觉得你应该集中精力

SchemaExport Class

这个类使你的配置动态所以它可以让你选择你最喜欢的套房…

结帐[架构导出]

首先,hbm2ddl配置属性的可能值如下:

  • none-不执行任何操作。不会生成架构。
  • create-only-将生成数据库模式。
  • drop-数据库模式将被删除。
  • create-数据库模式将被删除并随后创建。
  • create-drop-数据库模式将被删除并随后创建。关闭SessionFactory后,数据库模式将被删除。
  • validate-数据库模式将使用实体映射进行验证。
  • update-将通过比较现有数据库模式与实体映射来更新数据库模式。

hibernate.hbm2ddl.auto="update"很方便,但如果您计划添加函数或执行一些自定义脚本,则不太灵活。

所以,最灵活的方法是使用Flyway

但是,即使您使用Flyway,您仍然可以使用hbm2ddl生成初始迁移脚本。

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

虽然这是一篇相当古老的文章,但由于我对这个话题做了一些研究,所以想到分享它。

hibernate.hbm2ddl.auto

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

创建|更新|验证|创建-删除

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

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

以下是值得注意的要点:

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

    -如果数据库中不存在模式:-它创建模式

    -如果数据库中存在模式:-更新模式。

自5.0,您现在可以在专用的Enum#1中找到这些值(从5.2开始使用值NONE增强)。

或者更好的是,自5.1,您还可以使用#0Enum,它结合了JPA 2和“遗留”Hibernate DDL操作。

但是,您还不能用它以编程方式配置DataSource。将其与#1结合使用会更好,但当前代码期望String值(摘自#3):

this.schemaAutoTooling = SchemaAutoTooling.interpret( (String) configurationSettings.get( AvailableSettings.HBM2DDL_AUTO ) );

#1#2的内部enum值不会公开。

下面是一个示例编程DataSource配置(在我的Spring Boot应用程序中使用),它使用了.name().toLowerCase()的gambit,但它只适用于没有破折号的值(例如不是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();}
  • validate:验证架构,数据库不会发生任何更改。
  • update:使用当前执行查询更新架构。
  • create:每次都创建新的模式,并销毁以前的数据。
  • create-drop:当应用程序停止或SessionFactory显式关闭时删除架构。

hibernate.hbm2ddl.auto在创建会话工厂时自动验证DDL并将其导出到模式。

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

  • 创建-正在创建模式

    <entry key="hibernate.hbm2ddl.auto" value="create">
  • update - updating existing schema

    <entry key="hibernate.hbm2ddl.auto" value="update">
  • validate - validate existing schema

    <entry key="hibernate.hbm2ddl.auto" value="validate">
  • create-drop - create and drop the schema automatically when a session is starts and ends

    <entry key="hibernate.hbm2ddl.auto" value="create-drop">

validate:它验证架构并且不更改数据库。
假设您在映射文件中添加了一个新列并执行插入操作,它将抛出一个异常“缺少XYZ列”,因为现有模式与您要插入的对象不同。如果您通过手动添加新列来更改表,然后执行插入操作,那么它肯定会将所有列和新列一起插入到表中。意味着它不会对现有模式/表进行任何更改/更改。

update:当您执行操作时,它会更改数据库中的现有表。您可以使用此选项hbm2ddl添加或删除列。但是,如果您要添加一个新的列,即“非NULL”,那么它将忽略将该特定列添加到数据库中。因为如果您想在现有表中添加“非NULL”列,则表必须为空。

对于任何搜索默认值的人…

它是在Spring-boot的2.0.5版和JpaProperties的1.1.0版的源代码中编写的:

    /*** DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto"* property. Defaults to "create-drop" when using an embedded database and no* schema manager was detected. Otherwise, defaults to "none".*/private String ddlAuto;

以上所述…请注意,这个属性被称为dll.auto,应该只控制dll操作(创建/删除模式/表),我惊讶地发现它也与dml有关:只有update允许插入数据,这是dml操作。

在尝试将数据填充到内存数据库时遇到了这个问题;只有update有效。