在hibernateMap中使用 Package 器Integer类或int原语

kkbh8khc  于 2023-08-06  发布在  其他
关注(0)|答案(5)|浏览(105)

在我工作的公司里,我们有一个主要的讨论,关于是否应该更好地为原语使用 Package 类(java.lang.Integer,java.lang.Long),或者是否应该直接在将实体Map到Hibernate中的表的POJO中使用原语类型。
我们的想法是,我们希望这些值在数据库中不为空。

支持使用原语的论据:

  • 将这些值作为int处理意味着它们永远不会为null,这样就不可能无意中在字段上获得null引用。
  • int=32/64位内存。整数= 16字节的内存,而且也比较慢
    支持使用 Package 对象的论据:
  • 我们可以在数据库级别添加一个约束,以始终防止空值到达那里
  • 我们可能最终得到误导性的数据,当用户没有设置值时,数据库中可能有0而不是null,并且错误的数据是一个很坚韧捕捉的数据。
  • 对象比基元具有更强的表达能力。我们有空值和整数值,所以我们可以使用注解(例如javax.validation. constrains.NotNull)更容易地验证它们。
chhqkbe1

chhqkbe11#

使用 Package 纸,让你的生活变得简单。
你的数据模型应该决定这一点。无论如何,您都应该在数据库中强制执行空性。
如果它们在数据库中可为空,则使用 Package 器。如果它们是不可空的,并且您使用了 Package 器,那么如果您尝试向数据库中插入空值,您将得到一个异常。
如果您的数据模型没有规定它,那么请遵循一个约定,始终使用 Package 器。这样,人们就不必思考或决定值0意味着null。
我也会质疑你的Assert,它会降低性能。你量过这个吗?我是说真的测量过了?当您与数据库交谈时,除了16位和32位之间的差异之外,还有更多的考虑因素。
只需使用简单、一致的解决方案。在任何地方都使用 Package 器,除非有人给你一个非常好的理由(有准确的测量统计数据)。

rjee0c15

rjee0c152#

我觉得应该提一下:
Hibernate推荐(第4.1.2节)在持久化类中使用非原始属性实际上是指(如标题所示)标识符属性

4.1.2.提供标识符属性

Cat有一个属性叫做id。此属性Map到数据库表的主键列。这个属性可以被称为任何东西,它的类型可以是任何原始类型,任何原始的“ Package 器”类型,java.lang.String或java. util. Date。
...
我们建议您在持久化类上声明一致命名的标识符属性,并使用可空(即非原始)类型。
尽管如此,原语的优势并不明显:
1.在属性中有不一致的非空值比NullPointerException更糟糕,因为潜伏的bug更难跟踪:从编写代码到检测到问题将经过更多的时间,并且问题可能出现在与其源完全不同的代码上下文中。
1.关于业绩:在测试代码之前-这通常是一个过早的考虑。安全第一。

rslzwgfq

rslzwgfq3#

Hibernate文档(只是我碰巧找到的第一个版本)指出:
这个属性可以被称为任何东西,它的类型可以是任何原始类型,任何原始的“ Package 器”类型,java.lang.String或java. util. Date。
...
我们建议您在持久化类上声明一致命名的标识符属性,并使用可空(即非原始)类型。
所以“Maven的声音”建议使用Integer/Long……但没有说明为什么会这样
我想知道是否这样一个还没有被持久化的对象可以在没有标识符的情况下被创建(即属性值为null),将其与持久化实体区分开来。

gpnt7bae

gpnt7bae4#

我会站在一个肢体上,不同意这里所有其他的答案。如果该字段在数据库中可为空,请使用 Package 。如果不能为null,则使用原语。现在您获得了性能上的好处,并且可以更容易地区分代码中哪些字段可以为null,哪些字段不可以为null。

hjqgdpho

hjqgdpho5#

如果你使用的是像mongo db这样的数据库,或者当它的nullWrapper一起使用时,数据有意义,

提示:如果你正在做计算,只需创建一个extraNullChecked getter,并使用它来避免整个代码库的null检查。

如果Data点必须始终有值且不能为null,则使用原语

相关问题