2013-07-01 34 views
8

Jpa实体生成器将Integer类型分配给我的实体的id字段。我DB中的相应属性/列是串行类型(是postgres)。我也将整数类型分配给我的实体ID字段。但是我在this page上看到了Long getId()的用法。我也看到了这种类型的geomajas例子的类型分配。在使用Integer时有什么疑问吗?我的意思是,是啊,你必须小心整数,ID不低于0,但同时你也必须确保你的长ID不大于2,147,483,647。那么这里有什么?对于java实体的id字段的长整数与整数

编辑:我正在Long和无符号整数之间的混乱,所以我猜我在想什么是“无符号整数与Integer的Java实体的id字段”,这完全是无稽之谈,现在我的长和无符号整数之间的混淆是不见了。我的错。感谢您的回答和评论。我想如果我会用bigserial jpa实体生成器也会使用Long。

+1

“小心整数,该ID不低于0”所有的java数字类型都有符号。 long和integer之间的差值是值的最小/最大范围。 –

+1

如果您有大型表格,使用long的点最有可能是long值最大值远高于“2,147,483,647”(9,223,372,036,854,775,807)。 –

回答

7

Long具有比Integer数据类型更大的容量,因此,如果你不知道你的数据会是什么长度是,它能够更好地使用Long类型的数据...

。另一方面是,因为Long拥有更大的容量,它使用额外的空间,如果你确定你的数据不会比Integer数据类型更大然后使用Long只是让你的代码效率低下

7

JPA实体生成分配整型到我的实体的ID字段

您设置ID字段的类型,JPA生成器使用唯一值填充它。你可以自由使用Integer或Long。

在使用Integer时是否有任何疑问?

不是真的,整数&龙之间的唯一差别是比特数(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定义。

简单地确定(您应用程序每周生成的最大Ids数)x(您的应用程序可以“活”的最大周数)。如果结果小于1,500,000,000(提供安全余量),则可以使用Integer;否则使用Long。

+0

我已经说过我做了一个混淆,但是我很高兴你发布了这个,这很有趣 – osh

0

最大的问题是,当你查询一个实体时,你需要使用EXACT TYPE,或者执行时抛出异常。这是一个RUNTIME异常。

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

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

要进一步说明这个问题,请考虑'大小'不会影响数据包到/从数据库。