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

Posted

技术标签:

【中文标题】在 Hibernate 中设置属性的默认值不起作用【英文标题】:Doesn't work setting default value of property in Hibernate 【发布时间】:2012-11-15 15:35:57 【问题描述】:

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

@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。如果有任何帮助,我将不胜感激。提前致谢!

【问题讨论】:

【参考方案1】:

尝试使用BOOLEAN 数据类型,像这样定义@Column 注释:

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

【讨论】:

不幸的是它没有帮助。数据库中只有 BIT 类型已更改为 TINYINT。但同样它没有收到默认值。感谢您的建议! 是的,当然。我仍然在测试模式下使用hibernate.hbm2ddl.autocreate-drop。现在我在数据库中有IS_ACTIVE TINYINT(1) NOT NULL DEFAULT '0',。很好!但为什么默认值为 NULL?你有什么想法吗? 当我尝试保存此类的实例时,我再次收到异常 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'IS_ACTIVE' cannot be null... 尝试在类中初始化布尔值。更新了我的答案。 或者将布尔值改为原始布尔值。【参考方案2】:

参考此链接中的正确答案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)

【讨论】:

以上是关于在 Hibernate 中设置属性的默认值不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Android/MIUI 在通知栏中设置小图标不起作用?显示的默认图标

ReactJS - CSS:在样式对象中设置 trasitionProperty 不起作用

在 Xcode 4.3 中设置属性值不固定/viewDidLoad 被多次调用

Android:在 TextAppearance 中设置 fontFamily 不起作用

在代码中设置 textview 的边距和重力不起作用

默认日期设置不起作用Angularjs指令