我有一个带有以下变量的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答案,这实际上不是一个选择