在Hibernate中设置属性默认值不起作用。

19

我的实体中有一个布尔属性。以下是我的注解:

@Column(name = "IS_ACTIVE", nullable = false, columnDefinition="BIT DEFAULT 1", length = 1)
public Boolean getActive() {
    return isActive;
}

但是columnDefinition="BIT DEFAULT 1"并不完美地工作。以下是生成表的结果的SQL代码:

IS_ACTIVE BIT(1) NOT NULL,

我做错了什么?

当我尝试将这个类的实例保存到数据库中时,就会出现异常:

`com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'IS_ACTIVE' cannot be null`

如果我删除nullable = false属性:
@Column(name = "IS_ACTIVE", columnDefinition="BIT DEFAULT 1", length = 1)
public Boolean getActive() {
    return isActive;
}

我希望能够保存创建的对象。但是,默认值未设置,因此在数据库中该字段的值为NULL。

请问有什么建议吗?如果重要的话,我使用的是MySQL Server 5.1版本。非常感谢您的帮助。提前致谢!

3个回答

38

尝试使用 BOOLEAN 数据类型,将您的 @Column 注释定义为:

@Column(name = "IS_ACTIVE", columnDefinition = "boolean default true", nullable = false)
private Boolean active = true;

很遗憾,它并没有起到作用。只有数据库中的BIT类型已更改为TINYINT。但是仍然没有接收到默认值。感谢您的建议! - Philiph Bruno
当然。我仍然在测试模式下使用 hibernate.hbm2ddl.autocreate-drop 功能。现在我的数据库中有一个 IS_ACTIVE TINYINT(1) NOT NULL DEFAULT '0', 字段。非常好!但是为什么默认值是 NULL 呢?你有什么想法吗? - Philiph Bruno
1
当我尝试保存这个类的一个实例时,我再次收到异常com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'IS_ACTIVE' cannot be null - Philiph Bruno
或将Boolean更改为原始的boolean。 - Aleksandr M
它能正常工作。谢谢!这种方法是否是良好的实践?(在Java代码中初始化变量而不是在数据库中)或者这个问题是否无法通过其他方式解决? - Philiph Bruno
显示剩余3条评论

2

参考此链接中的正确答案:如何在Hibernate中设置默认值

如果您想要一个真正的数据库默认值,请使用columnDefinition - @Column(name = “myColumn”, nullable = false, columnDefinition = “int default 100")。请注意,columnDefinition中的字符串取决于数据库。此外,如果您选择此选项,您必须使用dynamic-insert,这样Hibernate在插入时不会包括具有null值的列。否则谈论默认值就是无关紧要的。

解决方案的关键是dynamic-insert注释。您可以将其添加到实体类中,如下例所示:@org.hibernate.annotations.Entity(dynamicInsert = true)


0
确保在实体类的布尔属性中设置了默认值为false。确保你有类似以下代码: private boolean yourBooleanAttribute = false;
你可以在实体类中使用@Column注解来显式指定列定义。确保你使用columnDefinition属性将默认值设置为false,以便在生成的SQL中生效:
@Column(columnDefinition = "boolean default false") private boolean yourBooleanAttribute;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接