29

假设您正在使用 Hibernate 和 JBoss 开发 Java EE 应用程序。您有一个正在运行的服务器,上面有一些重要数据。您偶尔(1-2 周)发布应用程序的下一个版本,并且它们在持久层中有很多变化:

  • 新实体
  • 移除的实体
  • 属性类型更改
  • 属性名称更改
  • 关系变化

您如何有效地建立一个更新数据库模式并保留数据的系统?据我所知(我可能弄错了),Hibernate 不执行更改列、删除/更改约束。

谢谢你,Artem B。

4

8 回答 8

17

LiquiBase是您最好的选择。它有一个hibernate 集成模式,使用 Hibernate 的 hbm2ddl 来比较你的数据库和你的 hibernate 映射,但它不会自动更新数据库,它会输出一个 liquibase 更改日志文件,可以在实际运行之前对其进行检查。

虽然更方便,但任何比较数据库和休眠映射的工具都会出错。有关示例,请参见http://www.liquibase.org/2007/06/the-problem-with-database-diffs.html。使用 liquibase,您可以在开发时建立一个数据库更改列表,该格式可以在带有分支和合并的代码中存活。

于 2009-04-15T03:22:22.320 回答
4

我个人会跟踪迁移 SQL 脚本中的所有更改。

于 2009-04-10T15:57:13.903 回答
4

您可以使用https://github.com/Devskiler/jpa2ddl工具,该工具提供 Maven 和 Gradle 插件,并且能够基于 JPA 实体为Flyway生成自动模式迁移。它还包括所有属性、方言、用户类型、命名策略等。

于 2017-10-27T21:58:21.357 回答
2

http://liquibase.org/

于 2009-04-10T16:04:25.070 回答
2

对于一个应用程序,我使用 SchemaUpdate,它内置于 Hibernate,直接来自引导程序类,因此每次应用程序启动时都会检查架构。这负责添加新的列或表,这主要发生在成熟的应用程序中。为了处理特殊情况,比如删除列,引导程序只是在 try/catch 中手动运行 ddl,所以如果它已经被删除一次,它只会默默地抛出一个错误。我不确定我是否会在生产应用程序中处理关键任务数据,但在几年和数百次部署中,我从来没有遇到过问题。

于 2009-04-11T15:30:10.340 回答
2

作为 Nathan Voxland 关于LiquiBase的进一步回应,下面是一个在 Windows 下为 mySql 数据库执行迁移的示例:

例如,将 mysql连接器放在 liquibase 发行版中的lib文件夹下。

在 liquibase 发行版的根目录中创建一个文件属性liquibase.properties并插入此循环行:

driver: com.mysql.jdbc.Driver
classpath: lib\\mysql-connector-java-5.1.30.jar
url: jdbc:mysql://localhost:3306/OLDdatabase
username: root
password: pwd

以其他名称生成或检索更新的数据库,例如NEWdatabase

现在,您将使用以下命令行提取文件Migration.xml中的差异:

liquibase diffChangeLog --referenceUrl="jdbc:mysql://localhost:3306/NEWdatabase" 
--referenceUsername=root --referencePassword=pwd > C:\Users\ME\Desktop\Migration.xml

最后使用刚刚生成的Migration.xml文件执行更新:

java -jar liquibase.jar --changeLogFile="C:\Users\ME\Desktop\Migration.xml" update

注意:所有这些命令行都应该从 liquibase.bat/.sh 和 liquibase.jar 所在的 liquibase 主目录执行。

于 2014-07-17T09:28:04.003 回答
1

我使用 hbm2ddl ant 任务来生成我的 ddl。有一个选项可以在您的数据库中执行更改表/列。

请查看 hbm2ddl 蚂蚁任务的“更新”属性:

http://www.hibernate.org/hib_docs/tools/reference/en/html/ant.html#d0e1137

更新(默认值:false):尝试创建一个更新脚本,表示数据库中的内容与映射指定的内容之间的“增量”。忽略创建/更新属性。(不要生产数据库使用,完全不保证可以生成正确的增量,也不保证底层数据库可以实际执行所需的操作)

于 2009-04-11T01:25:11.713 回答
1

您也可以使用DBMigrate。它类似于 Liquibase :

与 Ruby on Rails 的 'rake migrate' 类似,此库可让您管理 Java 应用程序的数据库升级。

于 2010-10-09T09:07:32.113 回答