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

时间:2012-11-27 22:05:30

标签: java hibernate jpa hibernate-mapping hibernate-annotations

我的实体中有一个布尔属性。这是我对它的注释:

@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。我会非常感谢任何帮助。提前谢谢!

2 个答案:

答案 0 :(得分:31)

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

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

答案 1 :(得分:0)

参考此链接How to set default value in Hibernate

中的正确答案

如果您想要一个真正的数据库默认值,请使用columnDefinition - @Column(name =“myColumn”,nullable = false,columnDefinition =“int default 100")。请注意,columnDefinition中的字符串与数据库有关。此外,如果选择此选项,必须使用动态插入,因此Hibernate不会在插入时包含空值的列。否则谈论违约是无关紧要的。

解决方案的关键是动态插入注释。您可以将其添加到您的实体类中,例如:@org.hibernate.annotations.Entity(dynamicInsert = true)