Java 更改列类型时休眠和架构更新

Java 更改列类型时休眠和架构更新,java,hibernate,jpa,Java,Hibernate,Jpa,我有Hibernate来设置我的实体。对于开发人员环境,我希望Hibernate处理模式更新(主要是添加新列、删除或编辑列类型)。添加新列时,Hibernate将添加它。从实体中删除字段不会导致列从数据库中删除。在一些帖子中,我读到这是正常的行为。但当我试图编辑实体字段的类型时,出现了一个问题: @Entity class Person { String lastName; //This is the new column } 这导致Hibernate添加一个VARCHAR(255)

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

@Entity
class Person {

    String lastName; //This is the new column
}
这导致Hibernate添加一个VARCHAR(255)类型的列,默认值为NULL,NOTNULL为YES

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

将列类型更改为
int
会产生错误。Hibernate引发了一个
IllegalArgumentException
,试图向int字段添加Null值

我认为Hibernate会删除该列,重新创建它,然后添加空值,而不会出现任何问题(因为int字段可以有空值)。总是在列名中提供默认值是一种好的做法吗?也许是在一个函数中使用PrePersist

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

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

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


您应该研究一个真正的模式迁移工具,比如or

在某些情况下,删除一个表是不好的,但您必须这样做,在开发阶段,这是可能的,或者删除一个模式以确保重新启动时生成新的模式。我的问题是,当我说我的字段不为null时,为什么它会尝试输入null值(这是不添加任何批注时的默认行为)因为您的列是varchar,但我将其改为intIt,直到您删除一个表并让hibernare恢复它,它才起作用。没错,我知道,您是对的。但因为我们仍处于开发阶段,在产品进入最后阶段之前可能会有很多迁移,所以我不想写(团队的其他成员也是如此)每个更改的sql迁移代码。添加一列的迁移代码,认为简单的hibernate会很容易处理flyway的事情很了不起:我原以为hibernate会这么做,但现在我卡住了,不想这么做……事情发生了,我发现flyway在迁移里面有数据。