【问题标题】:Hibernate and schema update when changing column type更改列类型时的休眠和模式更新
【发布时间】:2015-08-31 08:09:07
【问题描述】:

我有 Hibernate 来设置我的实体。对于开发人员环境,我希望 Hibernate 处理模式更新(主要是一些添加新列、删除或编辑列类型)。当添加一个新列时,Hibernate 会添加它。从实体中删除字段不会导致列从数据库中删除。在一些帖子中,我读到这是正常行为。但是当我尝试编辑实体字段的类型时出现了问题:

@Entity
class Person {

    String lastName; //This is the new column
}

这导致 Hibernate 添加一个类型为 VARCHAR(255) 的列,默认值为 NULL,NOT NULL 为 YES。

数据库已经有一条记录(我正在测试行为),因此 Hibernate 添加了具有现有行为的列,其值为空字符串。我没有在实体的构造函数中添加列的初始化。

将列类型更改为int 产生了错误。 Hibernate 提出了一个 IllegalArgumentException 试图将 Null 值添加到 int 字段。

我认为 Hibernate 会删除该列,重新创建它,然后毫无问题地添加 Null 值(因为 int 字段可以具有 NULL 值)。总是在列名中给出默认值是一种好习惯吗?也许在 PrePersist 的函数中?

@PrePersist
public void prePersist(){
    this.lastName = 5; //after changing lastName to int.
}

我想在这里补充一点,即使在开发中我们也不想丢弃表格。我们希望保持当前值。

【问题讨论】:

  • 在某些情况下,删除表并不好,但您必须这样做,在开发阶段是可能的,或者删除架构以确保在重新启动时生成新架构。跨度>
  • 我的问题是为什么当我说我的字段不为空时它会尝试输入空值(这是不添加任何注释时的默认行为)
  • 因为你的列是 VARCHAR
  • 但我将其更改为 int
  • 只有在你删除一个表并让 hibernare 恢复它之后它才会起作用。

标签: java hibernate jpa


【解决方案1】:

您使用了错误的工具。 Hibernate 模式迁移从未被认为是模式迁移的完整解决方案。您可能会为当前的问题找到解决方案,但会偶然发现下一个问题。

您应该研究一个真正的架构迁移工具,例如 liquibaseflyways

【讨论】:

  • 是的,我知道,你是对的。但是因为我们仍处于开发阶段,并且在产品达到更最终阶段之前可能会有很多迁移,所以我不想(所以团队的其他成员)为每个更改编写 sql 迁移代码。添加一列的迁移代码,认为简单的hibernate会很容易处理
  • flyway 的东西太棒了 :D 我虽然 hibernate 会这样做,但现在我卡住了,我不想这样做......事情,我发现它非常有用
  • Flyway 在迁移包含数据的数据库时似乎出现问题。
猜你喜欢
  • 1970-01-01
  • 2013-05-08
  • 2011-06-20
  • 1970-01-01
  • 2014-04-01
  • 2011-06-20
  • 2015-03-11
  • 1970-01-01
  • 2013-12-28
相关资源
最近更新 更多