16

Jpa 实体生成器将整数类型分配给我的实体的 id 字段。我的数据库中相应的属性/列是串行类型(是的postgres)。我还将整数类型分配给我的实体 id 字段。但我Long getId()这个页面上看到了 的用法。我还在 geomajas 示例中看到了这种类型的分配。使用时有什么问题Integer吗?我的意思是,是的,您必须注意 id 不低于 0 的整数,但同时您还必须确保您的 Long Id 不大于 2,147,483,647。那么这里有什么交易呢?

编辑:我在无符号整数和无符号整数之间产生混淆,Long所以我想我在想的是“无符号整数与Integerjava 实体的 id 字段”,现在我在长整数和无符号整数之间的混淆已经消失了,这是无意义的。我的错。感谢您的回答和评论。我想如果我使用 bigserial jpa 实体生成器也会使用 Long。

4

3 回答 3

19

Long具有比数据类型大得多的容量Integer,因此如果您不确定数据的长度,最好使用Long类型数据...

另一方面,由于Long容量更大,它使用额外的空间,如果您确定您的数据不会大于Integer数据类型,那么使用Long只会使您的代码效率低下

于 2013-07-01T06:04:34.787 回答
11

Jpa 实体生成器将整数类型分配给我的实体的 id 字段

您设置 id 字段的类型,JPA 生成器用唯一值填充它。您可以自由使用整数或长整数。

在使用 Integer 时有什么问题吗?

并非如此,Integer 和 Long 之间的唯一区别是位数(64 v 32)和允许范围:

Integer:             -2,147,483,648  to  2,147,483,647
Long:    -9,223,372,036,854,775,808  to  9,223,372,036,854,775,807

生成器将为 Id 字段分配值。可以控制初始生成值:对于@SequenceGenerator 和@TableGenerator,设置initialValue 属性;对于身份生成器,修改身份列的数据库 DDL 定义。

只需确定(您的应用每周生成的最大 Id 数)x(您的应用可以“上线”的最大周数)。如果结果小于 1,500,000,000(给出安全边际),请随意使用 Integer;否则使用 Long。

于 2013-07-01T07:01:53.063 回答
2

最大的“陷阱”是当你查询一个实体时,你需要使用 EXACT TYPE,或者抛出异常的实现。这是一个 RUNTIME 异常。

entityManager.find(MyClass.class, intVal); // fails if type is long
entityManager.find(MyClass.class, longVal); // fails if type is integer

我认为为了可维护性,实体之间的一致性与任何内存考虑一样重要。

为了进一步说明这一论点,请考虑“大小”不会影响进出数据库的数据包。

于 2016-10-27T11:47:45.483 回答