java - 如何以正确的方式更新生产中的 Hibernate 应用程序?

标签 java hibernate postgresql jenkins

我读了discussion about using hbm2ddl.auto=update以便自动更新对数据库架构的更改。

帖子来自 2008 年,我不知道今天使用自动更新模式有多安全。

我们在带有 Hibernate 4.3.11 和 PostgreSQL 的 Glassfish 上运行一个小型 JavaEE。我们计划使用与 Jenkins 的持续集成。

启用 hbm2ddl.auto=update 是否有用?或者使用一种简单的替代方法来手动更新/检查更新是否更好?

我知道很难给出一个笼统的声明。

最佳答案

您不应使用 hbm2ddl.auto=update 来更新生产数据库。

几个原因:

  • Hibernate 只会插入缺失的列,而不会修改现有的列。因此,如果您将一个属性(Client 重命名为 Customer),Hibernate 将创建一个新的列Customer,留下Client 未受影响。您将需要手动将数据“移动”到那里并删除孤立列。
  • Hibernate 不会删除对不再映射的列的约束。因此,如果您的 Client 列是 NOT NULL,那么对该表的任何插入查询现在都会首先失败,因为 Hibernate 不会为孤立列提供任何数据(仍然有 NOT NULL 约束)。
  • Hibernate 不会触及现有列的数据类型。因此,如果您将属性类型从 String 更改为 Date - Hibernate 会将列定义保留为 varchar。
  • Hibernate 不会删除您删除了属性的列,这会导致数据污染和最坏的情况(约束仍然存在)导致应用程序不再工作。
  • 如果您在现有列上创建额外的约束 - hibernate 将不会创建它们,因为该列之前已经存在。 (您可能会错过在现有列上添加的生产数据库的重要约束)

因此,自行执行更新更安全。如果您必须考虑 hibernate 正在做什么和不做什么 - 您最好从头开始自己做。

关于java - 如何以正确的方式更新生产中的 Hibernate 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32634122/

相关文章:

java - for循环的最后一次迭代不输出

java - MyBatis 中不同关联中两次映射同一个表

java - Maven如何在编译时显示代码警告

java - 在 Java 中从 URL 中读取 XML 字符串

java - 什么是用于文件创建的良好设计模式?

Spring Data Jpa通用投影findAll

java - 与 Collection<Integer> 的一对多

尽管刷新和事务提交, hibernate 实体属性没有被持久化到数据库中

postgresql - 从 RDS postgres 只读副本和 sqlalchemy 流式传输大型结果集过早终止

java - 查询postgres select不返回结果?