将enabled变量声明为Boolean还是boolean有区别吗?从内存占用的角度来看,这是更可取的。
@Entity
class User {
@Column
Boolean enabled;
}
答案 0 :(得分:24)
我通常建议使用原始类型,只是为了摆脱所有地方的空检查。但这实际上取决于你想说什么。您的布尔值现在可以包含3个值:
在处理实体时,null可以创建一个全新的语义。我通常将其用作“无数据可用”。你的“启用”可能是这种领域的一个不好的例子。但是,假设你有一个数字可以保存一个人的年龄。
private Integer age;
使用null时,可以将其视为:“未知”。你也可以使用int并为这种情况定义一个特殊值(-1),但null是更自然的解决方案。
所以,总结一下。如果总是有一个有意义的值(必填字段?)和可选值的包装类,则使用原语。
答案 1 :(得分:13)
它们都映射到相同的列类型。从记忆的角度来看,原语可能会稍微轻一些,但差异几乎可以肯定是微不足道的。我认为原语会使它不可为空,但你也可以用注释来做到这一点。
答案 2 :(得分:9)
Kaleb是正确的 - 如果任何查询为“enabled”返回空值(在这种情况下),那么你必须使用对象而不是原语。
这是来自Hibernate FAQ:
当传递给setter方法的对象类型错误时,通常会发生PropertyAccessException。检查您的类型映射是否存在违规财产。 (要确切地查看哪个属性是问题,您可能需要禁用CGLIB反射优化器。)但是,此问题的最常见原因是Hibernate尝试将null分配给基本类型的属性。
如果您的对象具有映射到可空数据库列的基本类型属性,那么您将需要使用Hibernate自定义类型为空列值的大小写分配合理的默认(基元)值。更好的解决方案通常是为Java属性使用包装类型。