盒装vs原始类型作为实体ID

Mah*_*zad 21 java database orm hibernate jpa

在JPA(Hibernate实现)哪种类型最好用作实体id:盒装类型(例如Integer)或Unboxed类型(例如int)?

一位朋友说你应该使用盒装类型,因为当你在程序中创建一个新实体时,Hibernate看到id是null并且理解它应该在数据库中创建一个新行(相反,如果id不是nullHibernate可能会更新现有行在数据库中).

但是我的实体的id是int,它运行良好,没有任何错误,我们知道原始实例变量的默认值是0.所以他说可能hibernate对待0特殊并假设该对象是一个新对象.

gtg*_*ola 10

似乎当前文档 建议使用盒装类型.

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


Eug*_*ene 7

好吧,我们使用非原语,我们有充分的理由.例如,许多我们的字段int/Integer具有zero完全有效的绝对商业价值.以债务领域为例 - 如果该领域是zero,那就更好了,这意味着你没有债务.

问题是,对于原语,零是默认值 - 因此您可能会意外忘记例如通过a设置它setDebt,因此它可能会使用您从未打算过去的值到达您的数据库.出于这个原因,我们使用Integer了一些永远不应该为null的验证; 但即使我们忘了添加适当的验证,该代码将可能打破NullPointerException(最好在测试),我喜欢比数据库不一致的值更异常.

  • 这个答案没有解决这个问题。该问题专门询问@Id 字段。您可以通过从 1 开始序列来避免将 0 作为有效数字(这是 Hibernate 中的默认行为)。 (3认同)

小智 6

实体 id 的原始类型(例如,int)和它的包装器(例如,整数)之间没有区别。根据 JPA 规范,两者都是有效的。JPA 提供程序足够智能,可以跟踪实体的状态和生命周期。当实体 id 为 0(原始类型)或 NULL(包装类型)时,如果配置了 id 生成器,JPA 提供程序将为实体生成一个 id。如果 id 是自动生成的,则零不被视为有效的实体 id。

用 测试了这两种情况Cmobilecom JPA,效果同样好。当然,没有注意到性能差异。

免责声明:我是Cmobilecom JPA的开发人员,这是一个适用于 Java 和 Android 的轻量级 JPA 实现。