实体成员应该是原始数据类型还是java数据类型?

时间:2010-02-25 04:26:55

标签: jpa

将enabled变量声明为Boolean还是boolean有区别吗?从内存占用的角度来看,这是更可取的。

@Entity
class User {

     @Column
     Boolean enabled;
}

3 个答案:

答案 0 :(得分:24)

我通常建议使用原始类型,只是为了摆脱所有地方的空检查。但这实际上取决于你想说什么。您的布尔值现在可以包含3个值:

  1. 在处理实体时,null可以创建一个全新的语义。我通常将其用作“无数据可用”。你的“启用”可能是这种领域的一个不好的例子。但是,假设你有一个数字可以保存一个人的年龄。

    private Integer age;
    

    使用null时,可以将其视为:“未知”。你也可以使用int并为这种情况定义一个特殊值(-1),但null是更自然的解决方案。

    所以,总结一下。如果总是有一个有意义的值(必填字段?)和可选值的包装类,则使用原语。

答案 1 :(得分:13)

它们都映射到相同的列类型。从记忆的角度来看,原语可能会稍微轻一些,但差异几乎可以肯定是微不足道的。我认为原语会使它不可为空,但你也可以用注释来做到这一点。

答案 2 :(得分:9)

Kaleb是正确的 - 如果任何查询为“enabled”返回空值(在这种情况下),那么你必须使用对象而不是原语。

这是来自Hibernate FAQ:

当传递给setter方法的对象类型错误时,通常会发生PropertyAccessException。检查您的类型映射是否存在违规财产。 (要确切地查看哪个属性是问题,您可能需要禁用CGLIB反射优化器。)但是,此问题的最常见原因是Hibernate尝试将null分配给基本类型的属性。

如果您的对象具有映射到可空数据库列的基本类型属性,那么您将需要使用Hibernate自定义类型为空列值的大小写分配合理的默认(基元)值。更好的解决方案通常是为Java属性使用包装类型。

https://www.hibernate.org/116.html