我有一个包含以下变量的类
@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;
答案 0 :(得分:33)
- boolean
是一种原始类型,其值只能为true or false
。
- 而Boolean
是包装对象,可以获得 null 值。
- 提供了来自Java 1.5
AutoBoxing
的内容,因此您可以将布尔值转换为布尔值,并使用简单赋值运算符返回布尔值({{ 1}}),所以你可以在你想要布尔而不是布尔值的地方做到这一点。
答案 1 :(得分:10)
不要乱用hibernate代码,而是将表定义更改为默认空值为false(或0)。这样,当你从数据库中读取时,它将始终具有有效值(因为它是布尔值,因此更有意义)
答案 2 :(得分:3)
null
与false
不同(也不是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
是原始的,可以是true
或false
,默认为false
。要获得null
,它的对象类型为Boolean
。
答案 4 :(得分:-1)
你知道如果它抛出一个异常意味着它为null,你可以放一个try catch,因此将它设置为false。