当前位置: 首页 > 知识库问答 >
问题:

更改列类型时的Hibernate和架构更新

阴靖
2023-03-14

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

@Entity
class Person {

    String lastName; //This is the new column
}

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

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

将列类型更改为int会产生错误。Hibernate在尝试向int字段添加空值时引发IllegalArgumentException

我认为Hibernate会删除列,重新创建它,并添加Null值,而不会出现任何问题(因为int字段可以有Null值)。总是在列名中给出默认值是好的做法吗?也许在一个带有prepersisted的函数中?

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

我想在这里补充一点,即使在发展中,我们也不想放弃这张桌子。我们希望保持当前值。

共有1个答案

武友樵
2023-03-14

你用错工具了。Hibernate模式迁移从来没有被认为是模式迁移的完整解决方案。你可能会为当前的问题找到解决方案,但却在下一个问题上遇到了麻烦。

您应该研究像liquibase或flyways这样的真正的模式迁移工具

 类似资料:
  • 问题内容: 我正在尝试学习一些Flask,并且正在使用Flask-Migrate 1.6.0 所以我做了一个看起来像这样的模型 然后我将其更改为完全相同的东西,除了这一行: 当我运行我的 命令,它不会检测列类型的更改。我已经阅读了它,我知道当我更改env.py并添加compare_type = True变量时,它应该将其选中。但是我这样做无济于事,该方法现在看起来像这样 好的,所以我的问题是: 更

  • 问题内容: 我们需要将某些列的数据类型从int更改为bigint。不幸的是,其中一些表很大,大约有7-10百万行(但不宽)。 Alter表alter列将永远保留在这些表上。有没有更快的方法来实现这一目标? 问题答案: 巧合的是,大约3个小时前,我不得不做一些非常相似的事情。该表是3500万行,它相当宽,并且花了很多时间才能做到这一点: 这就是我最终得到的结果: 这次,这些陈述几乎是即时的。(在速度

  • 我使用Datastax Cassandra3.0,同时使用cqlsh模式在cassandra中创建表,正在更改列名,列名按字母顺序排列。请看下面。 这是创建表时的结构。 ...每月一次的瓦尔查尔, ...分配int, ...evdate日期, ...paymentterms int, ...percentageofpayment int, ...变体int, ...paymenttermsumma

  • 我想将一个表(表示为列表的列表)转换为。作为一个极其简化的例子: 将列转换为适当类型的最佳方法是什么,在本例中,列2和列3转换为浮点?在转换为DataFrame时是否有方法指定类型?还是先创建DataFrame,然后循环遍历列以更改每列的类型更好?理想情况下,我希望以动态的方式执行此操作,因为可以有数百个列,而我不想确切地指定哪些列属于哪种类型。我所能保证的是每列都包含相同类型的值。

  • 我有worker从resultset填充jtable,如下所示; 但所有列都是字符串。DB的“Isactive”列有点只有“1”或“0”Jtable显示该列为“true”或“false”,我需要在Jtable中编辑最后一列typr来boelan。我怎么做?

  • 问题内容: 然后,我想更改用户的默认架构(用户为) 我这样做:( 查询成功返回,但没有结果)。 当我尝试给出错误 虽然效果很好。 尝试为用户更改默认架构有什么问题? 问题答案: 我认为您需要重新登录。随着 你改变 运行时配置变量的会话默认值 同样来自 手册: 特定于角色的变量设置仅在登录时生效; 但是不要将更改应用于当前会话。如果要立即更改,请使用: 它将在会话级别更改路径