Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法将布尔值设置为null_Java_Spring_Hibernate - Fatal编程技术网

Java 无法将布尔值设置为null

Java 无法将布尔值设置为null,java,spring,hibernate,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 f

我有一个具有以下变量的类商店

@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来解决这个问题
私有布尔值atShop
但我想将其保留为
布尔值
,因为我正在将其保存为数据库中的一个位

有没有一种方法可以在不将
boolean
更改为
boolean
的情况下解决此问题

编辑:

我知道boolean只能是true/false,boolean可以设置为null,但是有没有办法让hibernate/spring将这个值设置为false(我认为应该自动设置),而不是试图将它设置为null并抛出这个异常

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

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

-
布尔
是一种基本类型,其值只能为
真或假

-
布尔值
是一个包装对象,可以给它一个空值


-提供了来自
Java 1.5
的自动装箱
,因此您可以使用简单赋值运算符将布尔值转换为布尔值并返回布尔值(
=
),因此,您可以在需要布尔值而不是布尔值的地方执行此操作。

布尔值
是基本值,可以是
真值
假值
,默认值为
假值
。要获取
null
,它的对象类型是
布尔值

,而不是摆弄hibernate代码,请将表定义更改为默认null值为false(或0)。这样,当您从数据库中读取时,它将始终具有有效值(因为它是布尔值,所以更有意义)

null
false
不同(与
true
也不同)
null
具有非常特定的含义。这就是为什么Hibernate会这么做。。。因为这是唯一有意义的事情,不管你认为它应该做什么

如果您希望指示Hibernate将这些列中的
null
视为false,唯一真正的解决方案是为这种特殊处理“null不是真正的null”开发一个自定义的Hibernate类型映射。您可以通过实现
org.hibernate.type.type
接口或
org.hibernate.usertype.usertype
接口来实现这一点。您最好扩展标准布尔类型映射,并在特殊的空处理中进行编织


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

如果它抛出一个表示它为null的异常,则可以对其进行尝试捕获,因此将其设置为FALSE。

是的,我知道布尔值和布尔值之间的区别,我的应用程序抛出了这个异常,因为spring/hibernate试图将atShop设置为null而不是false,但我如何才能让它将其设置为false和notnull呢?哎呀,我讨厌人们在没有任何解释的情况下投票否决答案,只是因为他们不完全是他们想要的答案。最重要的是,在这样一个原本不够清晰的问题上。这让我失去了尝试帮助的意愿。@Edwin Dalorzo:但不是我否决了答案,这就是为什么我在问题中添加了编辑部分,因为我没有解释我已经理解布尔值和布尔值之间的区别是我的错。一旦我知道,数据库中的布尔值将映射为1或0,所以你不需要列定义。如果您想确定,可以在持久性文件中添加映射,如true 1,false 0i尝试更新表中的列,使其默认值为0(
ALTER table Shop ALTER column atShop bit NOT NULL default(0)
),但我仍然遇到相同的错误您可能需要修复当前保存的所有值,它们将是空的。您也应该将该列设置为非空。我最终从表中完全删除了该列,并使用
ALTER table Shop ADD atshoppit NOT NULL DEFAULT(0)将其添加回
即使所有值都设置为0,并且看起来一切正常,错误仍然存在appearing@HipHipArray对于现有列,请尝试使用ALTER TABLE Shop为atShop添加默认值0
。如果您控制完成赋值的代码,但在本例中,OP从Hibernate获取值,则此操作有效,它为您完成所有的赋值和映射,因此,如果不实现Steve Ebersole在上面的回答中提到的Hibernate的类型处理程序,这并不是一个真正的选项
自动装箱
(即布尔-->布尔)总是可以正常工作。但您真正应该注意的是
自动取消装箱
(即布尔-->布尔),因为如果布尔包装对象为null,它会引发NullPointerException。通常,当您需要以NPE安全的方式取消包装布尔对象的装箱时,使用类似于
BooleanUtils.isTrue()或
Boolean.TRUE.equals()
的方法是一个好主意。