在hibernate映射中使用包装器Integer类或int原语

van*_*uez 37 java hibernate pojo primitive-types

在我工作的公司中,我们有一个关于是否应该更好地使用基元的包装类(java.lang.Integer,java.lang.Long)或是否直接在映射的POJO中使用基元类型的讨论Hibernate中表的实体.

我们的想法是,我们希望这些值在数据库中不为空.

支持使用原语的论据:

  • 将这些值作为int处理意味着它们永远不能为空,这样就不可能无意中在字段上获得空引用.
  • int = 32/64位内存.整数= 16字节的内存,也慢

支持使用包装器对象的参数:

  • 我们可以在数据库级别添加一个约束,以始终阻止空值到达那里
  • 我们最终可能会产生误导性数据,只要用户没有设置值并且错误的数据是一个难以捕获的数据,我们就可以在数据库中使用0而不是空值.
  • 物体比原始物具有更强的表达能力.我们有空值和整数值,因此我们可以使用注释(javax.validation.constraints.NotNull)更容易地验证它们.

Mat*_*ell 35

使用包装纸,让您的生活变得简单.

您的数据模型应该指明这一点.无论如何,您应该在数据库中强制执行可空性.

如果它们在数据库中可以为空,那么使用包装器.如果它们不可为空,并且您使用包装器,那么如果您尝试向数据库中插入null,则会出现异常.

如果您的数据模型没有规定它,那么请选择约定,始终使用包装器.这样人们就不必思考,或者确定值为0意味着为空.

我还会查询你的断言,它会降低性能.你测量过这个吗?我的意思是真的测量过吗?当您与数据库通信时,除了16位和32位之间的差异外,还有很多考虑因素.

只需使用简单,一致的解决方案.使用包装随处可见,除非有人给你一个非常好的理由(准确的测量统计)不这样做.


yai*_*air 10

以为应该提到:

使用持久化类中的非原始属性的Hibernate建议(第4.1.2节)实际上引用 - 标题为 - 标识符属性:

4.1.2.提供标识符属性

Cat有一个名为id的属性.此属性映射到数据库表的主键列.该属性可能已被调用,其类型可能是任何基本类型,任何原始"包装"类型,java.lang.String或java.util.Date.

...

我们建议您在持久化类上声明一致命名的标识符属性,并使用可空(即非原始)类型.

尽管如此,原语的优势并不强烈:

  1. 在属性有不一致的非空值比NullPointerException异常糟糕,因为潜伏的错误是很难跟踪:直到检测到问题,更多的时候会通过,因为编写代码,它可能比一个完全不同的代码上下文显示它的来源.
  2. 关于性能:在测试代码之前 - 通常是不成熟的考虑因素.安全应该是第一位的.


Jon*_*eet 7

Hibernate文档(只是我偶然发现的第一个版本)规定:

属性可能被称为任何东西,它的类型可能是任何原始类型、任何原始“包装器”类型、java.lang.String 或 java.util.Date。

...

我们建议您在持久类上声明一致命名的标识符属性,并使用可空(即非原始)类型。

所以“专家的声音”建议使用Integer/ Long... 但没有描述为什么会这样。

我想知道是否可以在没有标识符的情况下创建尚未持久化的对象(即属性值为null),从而将其与持久化实体区分开来。