在JPA(Hibernate实现)中,哪种类型更适合用作实体的id: Boxed型(例如Integer)还是Unboxed型(例如int)?

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

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

推荐答案

嗯,我们使用非原语,我们有很强的理由这样做.例如,我们的许多字段要么是int/Integer,要么是zero,其绝对业务价值是完全有效的.以债务字段为例-如果字段是zero,那就更好了,这意味着您没有债务.

问题是,对于原语,零是默认值-因此您可能意外地忘记了设置它,例如通过setDebt,因此它might到达您的数据库时会带有一个您从未打算放在那里的值.出于这个原因,我们使用Integer进行某些验证,例如,这些验证永远不应该为空;但是,即使我们忘记添加正确的验证,代码也可能会使用NullPointerException(最好是在测试中),而我更喜欢数据库中的异常,而不是不一致的值.

Database相关问答推荐

为什么postgres枚举需要4个字节?

Prisma - 将属性的类型设置为枚举数组

add_index 到数据模型 - Ruby on Rails 教程

H2 - 如何截断(truncate)所有表?

复合主键

数据库排序规则更改问题 (SQL Server 2008)

PostgreSQL - 按时间戳值分组?

Java 数据库连接池(BoneCP vs DBPool vs c3p0)

两个不同数据库中的两个表之间的连接有什么问题?

MySQL 中的多个 OR 子句

是否有任何用于 NoSQL 数据库架构迁移的工具?

是什么导致pyodbcunable to connect to data source?

PDO SQL 状态00000但仍然错误?

如何动态更改 Ruby on Rails 中所有模型的 Active Record 数据库?

Redis Pub/Sub 和 Redis Stream 之间的主要区别是什么?

如何在每个 SQLite 行中插入唯一 ID?

有哪些不同类型的索引,每种索引的好处是什么?

在具有所需 ForeignKey 引用的 Django (1.8) 应用程序之间移动模型

Windows phone 7 的本地 Sql 数据库支持

如何使用 T-SQL 检测 SQL Server 数据库的只读状态?