无法将布尔值设置为null

时间:2012-10-22 14:10:06

标签: java spring hibernate

我有一个包含以下变量的类

@Column(columnDefinition = "bit")
private boolean atShop;

使用此值,我使用HSQL从应用程序中检索此信息

from Person person
left join fetch person.shop

当我尝试调用此HSQL语句时,我收到以下错误

org.springframework.orm.hibernate3.HibernateSystemException: could not set a field value by reflection setter of com.test.dataobject.Shop.atShop; nested exception is org.hibernate.PropertyAccessException: could not set a field value by reflection setter of com.test.dataobject.Shop.atShop

这是因为它试图在HSQL中将布尔值设置为null。我可以通过将private boolean atShop;更改为private Boolean atShop;来解决此问题,但我希望将其保留为boolean,因为我将其保存在我的数据库中

有没有办法解决这个问题而不将boolean更改为Boolean

编辑:

我知道布尔值只能是true / false而布尔值可以设置为null,但有没有办法让hibernate / spring将此值设置为false(我认为它应该自动执行)而不是尝试将它设置为null并抛出此异常?

我还尝试添加注释以自动将值设置为false,但这不起作用

@Column(nullable = false, columnDefinition = "bit default 0")
private boolean atShop;

5 个答案:

答案 0 :(得分:33)

- boolean是一种原始类型,其值只能为true or false

- Boolean包装对象,可以获得 null 值。

- 提供了来自Java 1.5 AutoBoxing的内容,因此您可以将布尔值转换为布尔值,并使用简单赋值运算符返回布尔值({{ 1}}),所以你可以在你想要布尔而不是布尔值的地方做到这一点。

答案 1 :(得分:10)

不要乱用hibernate代码,而是将表定义更改为默认空值为false(或0)。这样,当你从数据库中读取时,它将始终具有有效值(因为它是布尔值,因此更有意义)

答案 2 :(得分:3)

nullfalse不同(也不是true)。 null具有非常特殊的含义。这就是Hibernate做它所做的事情的原因......因为它确实是唯一有意义的事情,尽管你认为它应该做什么。

如果你想指示Hibernate将这些列中的null视为false,那么唯一真正的解决方案就是开发一个自定义的Hibernate Type映射,以便对这种特殊的处理" null实际上不是null&# 34 ;.您可以通过实现org.hibernate.type.Type接口或org.hibernate.usertype.UserType接口来实现此目的。最好的办法是扩展标准布尔类型映射并在特殊的空值处理中编织。

但是,要注意的一件事是查询,因为检查与null的相等性在ANSI SQL中永远不会有效。它解析为SQL调用UNDEFINED,这通常意味着FALSE

答案 3 :(得分:1)

boolean是原始的,可以是truefalse,默认为false。要获得null,它的对象类型为Boolean

答案 4 :(得分:-1)

你知道如果它抛出一个异常意味着它为null,你可以放一个try catch,因此将它设置为false。