【发布时间】: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 恢复它之后它才会起作用。