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

Sam*_*Sam 20 jpa

将enabled变量声明为布尔值或布尔值是否有区别?从内存占用的角度来看,这是更可取的.

@Entity
class User {

     @Column
     Boolean enabled;
}
Run Code Online (Sandbox Code Playgroud)

whi*_*rra 24

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

  1. 真正
  2. 空值

在处理实体时,null可以创建一个全新的语义.我通常将其用作"无数据可用".你的"启用"可能是这种领域的一个不好的例子.但是,让我们说你有一个数字来保持一个人的年龄.

private Integer age;
Run Code Online (Sandbox Code Playgroud)

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

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


Kal*_*see 14

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

  • 请记住,如果您对“Entity”中的字段使用原始类型,并读取表中**已存在的**行,其中该字段的匹配列为“NULL”,那么 JPA 将抛出“IllegalArgumentException”当您尝试使用“Entity”查询该表时。 (3认同)

azp*_*p74 9

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

这来自Hibernate FAQ:

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

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

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