对于java实体的id字段的Long与Integer

时间:2013-07-01 05:55:53

标签: java jpa persistence

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

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

3 个答案:

答案 0 :(得分:12)

Long的容量远大于Integer数据类型,因此如果您不确定数据的长度,最好使用Long类型数据。 ..

另一方面,由于Long容量较大,因此会占用额外空间,如果您确定数据不会大于Integer数据类型,则使用Long只是让你的代码效率低下

答案 1 :(得分:8)

  

Jpa实体生成器将Integer类型分配给我的实体的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属性;对于Identity Generator,修改Identity列的数据库DDL定义。

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

答案 2 :(得分:1)

最大的'陷阱'是在查询实体时,需要使用EXACT TYPE,或者实现抛出异常。这是一个RUNTIME例外。

@Configuration
@EnableJms
public class JmsConfiguration implements JmsListenerConfigurer {

    @Value("${message-consumer.destination}")
    private String destination;

    @Inject
    private MessageListener messageListener;

    @Override
    public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
        SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
        endpoint.setId("audit.logging");
        endpoint.setDestination(destination);
        endpoint.setMessageListener(messageListener);
        registrar.registerEndpoint(endpoint);
    }

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

为了进一步推论这个论点,请考虑“' size'不会影响数据库的数据包。