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

时间:2011-09-21 21:19:37

标签: java hibernate pojo primitive-types

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

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

支持使用原语的论据:

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

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

  • 我们可以在数据库级别添加约束以始终阻止null 来自那里的价值
  • 我们可以最终得到误导性数据 每当用户没有时,在数据库中有0而不是空 设置一个值和错误的数据是一个艰难的问题。
  • 物体比原始物具有更强的表现力。我们还有空值 整数值,因此我们可以使用注释更轻松地验证它们 示例(javax.validation.constraints.NotNull)。

3 个答案:

答案 0 :(得分:33)

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

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

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

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

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

只需使用简单,一致的解决方案。在任何地方使用包装器,除非有人给你一个非常正确的理由(使用准确的测量统计数据)否则。

答案 1 :(得分:10)

认为应该提到:

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

  

4.1.2。提供标识符属性

     

Cat有一个名为id的属性。此属性映射到数据库表的主键列。该属性可能被称为任何东西,它的类型可能是任何原始类型,任何原始的“包装器”类型,java.lang.String或java.util.Date。

     

...

     

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

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

  1. 在属性中具有不一致的非空值比NullPointerException更糟糕,因为潜伏的bug很难跟踪:自编写代码到检测到问题并且可能以完全不同的方式显示时,将会经过更多时间代码上下文而不是源代码。
  2. 关于性能:在测试代码之前 - 通常是不成熟的考虑因素。应该首先考虑安全问题。

答案 2 :(得分:3)

Hibernate documentation(我碰巧找到的第一个版本)声明:

  

该属性可能已被调用,其类型可能是任何基本类型,任何原始“包装器”类型,java.lang.String或java.util.Date。

     

...

     

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

所以“专家的声音”建议使用Integer / Long ...但是没有描述为什么就是这种情况。

我想知道是否可以创建一个尚未持久化的对象而不用标识符(即属性值为null),将其与持久化实体区分开来