java boolean 和null_关于java:不能将boolean设置为null

我有一个带有以下变量的Shop商店

@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;

是的,我知道布尔值和布尔值之间的区别,我的应用程序抛出此异常,因为spring / hibernate尝试将atShop设置为null而不是false,但是如何获取将其设置为false而不是null呢?

哎呀,当人们对答案不满意而没有任何解释的时候,我讨厌它,只是因为他们不正是他们想要的东西。 首先,这样的问题本来还不够清楚。 这使我失去了寻求帮助的意愿。

@Edwin Dalorzo:但这不是我否决答案的原因,这就是为什么我在问题中添加了edit部分的原因,因为我的错是我没有解释我已经理解了布尔值和布尔值之间的区别

据我所知,数据库中的布尔值将被映射为1或0,因此您不需要columnDefinition。 如果需要确定的话,可以将映射添加到持久性文件中,例如true 1,false 0 property>

-boolean是原始类型,并且只能具有true or false的值。

-而boolean是包装对象,并且可以赋予空值。

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

AutoBoxing(即boolean-> Boolean)总是可以的。但您真正应该注意的是AutoUnboxing(即布尔->布尔值),因为如果您的布尔包装对象为null,它将抛出NullPointerException。通常,当需要以NPE安全的方式打开包装布尔对象时,最好使用BooleanUtils.isTrue()或Boolean.TRUE.equals()之类的东西。

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

我尝试更新表中的列以使其具有默认值0(ALTER TABLE Shop ALTER COLUMN atShop bit NOT NULL DEFAULT (0)),但是我仍然遇到相同的错误

您可能需要修复当前保存的所有值,它们将为null。您也应该将列设置为NOT NULL。

我最终从表中完全删除了该列,并使用ALTER TABLE Shop ADD atShopbit NOT NULL DEFAULT (0)将其添加回去,即使所有值都设置为0并且一切看起来都很好,错误仍然出现

@HipHipArray对于现有列,请尝试ALTER TABLE Shop ADD DEFAULT 0 FOR atShop。

null与false不相同(也不与true相同)。 null具有非常具体的含义。这就是为什么Hibernate会做它所做的事情的原因……因为它确实是唯一有意义的事情,尽管您认为它应该做。

如果要指示Hibernate将那些列中的null视为false,则唯一的解决方案是针对这种特殊的" null并非null"开发定制的Hibernate Type映射。您可以通过实现org.hibernate.type.Type接口或org.hibernate.usertype.UserType接口来实现。最好的选择是扩展标准的布尔类型映射,并编织特殊的null处理。

但是要注意的一件事是查询,因为根据null检查相等性在ANSI SQL中永远无效。它解析为SQL调用的UNDEFINED,通常表示false。

boolean是原始的,它可以是true或false,默认值为false。要获取null,其对象类型为boolean。

您确实知道,如果它抛出一个异常(表示它为null),则可以尝试一下捕获它,因此将其设置为false。

如果您可以控制完成分配的代码,但是在这种情况下,OP从Hibernate获取值,则Hibernate可以为您完成所有分配和映射,因此,无需为Hibernate实现自己的Type处理程序,如Steve中所述上面的Ebersoles答案,这实际上不是一个选择

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值