当前位置: 首页 > 面试题库 >

结合使用Hibernate的自动模式创建和数据库版本控制

宗弘扬
2023-03-14
问题内容

我有一个应用程序,每当该应用程序第一次在计算机上运行时,Hibernate都会创建我的所有表模式。这很好。

但是现在我想知道Hibernate是否具有某种机制来使数据库保持版本控制,即当我运行不同版本的应用程序时,Hibernate是否会知道如何将一个架构迁移到另一个架构,并且Hibernate找到与旧版本不同的数据库架构。版本存在吗?考虑到Hibernate可以读取现有的架构并将架构与映射描述进行比较,我以某种方式认为这应该可行。但是我不知道如何像使用Liquibase
/ Flyway创建更改脚本时那样告诉Hibernate迁移旧数据。

由于Hibernate和版本控制将向您展示很多有关审核和现场版本控制的信息,因此我可能没有在Google上搜索正确的内容,但是我在Liquibase /
Flyway类型的版本管理方面考虑更多。我从未考虑过两者,但是由于Hibernate不会创建更新脚本而是直接操作数据库,因此我不知道如何使两者一起工作。

这是我第一次让Hibernate创建架构而不是编写自己的脚本。我这样做是为了利用Hibernate
Envers使手动脚本创建变得更加乏味。也许我缺少明显的东西。感谢您对此事的任何投入!

更新:今天我必须与Flyway的开发人员交谈,他告诉我他不知道一个好的解决方案。也许什么都没有?


问题答案:

我们在Java /
Hibernate项目中遇到了同样的问题,并且不需要任何代码复制工作。hibernate的“更新”功能根本不可靠,LiquidBase更好,但也不是100%可靠的。最后,我们开发了一个简单的脚本来管理以下过程:

  1. Hibernate总是直接针对DEV数据库由“当前”数据库模式生成。
  2. 一系列LiquiBase变更集生成“先前”数据库架构。
  3. 每次需要迁移时,都会在“先前”数据库和“当前”数据库(两个实际的数据库,是的,这样更可靠)之间调用LiquiBase的“ diff”函数,从而生成新的LiquiBase变更集。
  4. 此更改集需要手动检查。所有更改集都保留在源代码控制中。
  5. PRODUCTION数据库具有通过应用所有LiquiBase变更集生成的架构。

我们脚本中的键盘命令如下所示:

${LIQB_COMMAND} ${PREV_DB_OPTIONS} --changeLogFile=${LIQB_CHGLOG_FILE_NEW}  \
    diffChangeLog \
                --referenceUsername=${DEV_DB_USER} \
                --referencePassword=${DEV_DB_PWD} \
                --referenceDriver=com.mysql.jdbc.Driver \
                --referenceUrl=${DEV_DB_URL}

这样,我们的迁移过程非常可靠,您无需编写模式代码两次。可以手动检查XML中生成的更改集,但是大多数时候都没有问题,而且与手动编写模式更改操作相比,它肯定容易得多。



 类似资料:
  • 问题内容: 我已经开发了一个客户维护应用程序。用户可以通过Web界面更改客户详细信息。我想处理以下情况: 加载详细信息。 加载详细信息。 更改并保存的。 只改变并保存年龄。 在上述情况下,最终数据库保留了旧名称和新年龄,因为覆盖了更新。我正在使用Hibernate。我听说Hibernate自动版本控制支持此功能。如果有人知道如何处理,请告诉我。 问题答案: 您只需要添加一个带有注释的字段: 阅读此

  • 问题内容: 我正在使用PostgreSQL和Spring 4,希望我的应用在运行时自动创建数据库。 我的实体类是: HibernateConfig.java application.properties 但是,当我运行SQL访问表User时,将出现错误:表’User’不存在。 如何使Hibernate自动创建数据库? 问题答案: 该物业将为您解决问题。创建SessionFactory时,它将自动验

  • 我正在使用PostgreSQL和Spring 4,并希望我的应用程序在运行时自动创建数据库。 我的实体类是: HibernateConfig。Java语言 application.properties 但当我运行SQL访问表User时,会出现错误:表“User”不存在。 如何使Hibernate自动创建数据库?

  • 我认为留档(http://flywaydb.org/getstarted/existingDatabaseSetup.html)不够清楚,希望用一个例子来说明。我有一个给你: 假设我们有两个不同版本的生产数据库(1和2),其模式版本是隐式的,但通过查询现有表来确定。然后,我们将如何实现文档中描述的内容? 在我的例子中,两个版本都附加了一个脚本:版本1:创建表版本2:创建表 我已经创建了与版本1和版

  • 我有一个spring-boot项目,该项目创建了一个H2内存数据库,其中包含由带有@Entity注释的类自动生成的表。我现在已经创建了另一个项目来连接到同一个数据库,但是每当我运行新的spring项目时,我认为创建了一个新的数据库来覆盖另一个数据库。 更新 尝试przemek hertel给出的答案,我得到以下错误:

  • 当应用程序启动时,我正在尝试创建mysql数据库。我尝试了波纹管配置,但无法实现,如果有人对此有想法,请告诉我,