作为实体 ID 的框内类型与基元类型

2022-09-01 15:59:37

在JPA(休眠实现)中,哪种类型更适合用于实体的id:盒装类型(例如)或未装箱类型(例如)?Integerint

一位朋友说你应该使用Boxed类型,因为当你在程序中创建新实体时,Hibernate会看到id是,并理解它应该在数据库中创建一个新行(相比之下,如果id不是Hibernate可能会更新databse中的现有行)。nullnull

但是我的实体的id是并且它运行良好,没有任何错误,我们知道原始实例变量的默认值是 。所以他说,也许冬眠被视为特殊,并假设该对象是一个新对象。int00


答案 1

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

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


答案 2

好吧,我们使用非原语,我们有一个强有力的理由。例如,我们的许多字段都具有绝对的业务价值,即完全有效。例如,想想一个债务字段 - 如果该字段是,这意味着你没有债务,那就更好了。int/Integerzerozero

问题是,对于基元,零是默认值 - 因此您可能会意外忘记设置它,例如通过 a ,因此它可能会以您从未打算去那里的值到达您的数据库。出于这个原因,我们使用一些验证,例如,永远不应该是空的;但是,即使我们忘记添加正确的验证,该代码也可能会与a(最好在测试中)中断,并且我更喜欢异常而不是数据库中的不一致值。setDebtIntegerNullPointerException


推荐