`
xiaoyaocao
  • 浏览: 275887 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

【转】JPA主键生成器和主键生成策略

阅读更多
JPA主键生成器和主键生成策略

JPA中创建实体时,需要声明实体的主键及其主键生成策略。我们有一个实体类叫做Email,其主键上声明如下:

 

@Id
@Column(name = "EMAIL_ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "emailSeq")
@SequenceGenerator(initialValue = 1, name = "emailSeq", sequenceName = "EMAIL_SEQUENCE")
private long id;

 

我们使用@GeneratedValue的strategry字段声明主键生成策略,generator声明主键生成器的名称,对应于同名的主键生成器@SequenceGenerator或者@TableGenerator。

与Hibernate不同,JPA只提供四种主键生成器策略,分别介绍如下:

GenerationType.IDENTITY

多数数据库支持IDENTITY列,数据库会在新行插入时自动给ID赋值,这也叫做ID自增长列,比如MySQL中可以在创建表时声明“AUTO_INCREMENT”, 就是一个ID子增长列:

CREATETABLE EMAIL{
    ID BIGINT NOT NULL AUTO_INCREMENT, MESSAGE VARCHAR(255) NOT NULL, PRIMARY KEY(ID)
}

JPA中IDENTITY类型的主键生成策略用法如下:

 

@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private long id;

 

由于主键由数据库自动插入,因此不需要额外的配置信息。

多数数据库支持IDENTITY策略:MySQL, SQL Server, DB2, Derby, Sybase, PostgreSQL。

GenerationType.SEQUENCE

Oracle不支持ID子增长列而是使用序列的机制生成主键ID,对此,可以选用序列作为主键生成策略:

 

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "emailSeq")
@SequenceGenerator(initialValue = 1, name = "emailSeq", sequenceName = "EMAIL_SEQUENCE")
private long id;;

 

上述声明等同于在数据库上创建一个序列:

create sequence EMAIL_SEQUENCE;

如果不指定序列生成器的名称,则使用厂商提供的默认序列生成器,比如Hibernate默认提供的序列名称为hibernate_sequence。

支持的数据库: Oracle、PostgreSQL、DB2

GenerationType.TABLE

有时候为了不依赖于数据库的具体实现,在不同数据库之间更好的移植,可以在数据库中新建序列表来生成主键,序列表一般包含两个字段:第一个字段引用不 同的关系表,第二个字段是该关系表的最大序号。这样,只需要一张序列就可以用于多张表的主键生成。 用法:

 

@TableGenerator( name = "emailSeq", table = "MY_PROJECT_SEQUENCE_TABLE", pkColumnName = "SEQUENCE_NAME", valueColumnName = "SEQUENCE_COUNT", initialValue = 1, allocationSize = 1)
@GeneratedValue( strategy = GenerationType.TABLE, generator = "emailSeq")

 

如果不指定表生成器,JPA厂商会使用默认的表,比如Hibernate在Oracle数据库上会默认使用表hibernate_sequence。

这种方式虽然通用性最好,所有的关系型数据库都支持,但是由于不能充分利用具体数据库的特性,建议不要优先使用。

GenerationType.Auto

把主键生成策略交给JPA厂商(Persistence Provider),由它根据具体的数据库选择合适的策略,可以是Table/Sequence/Identity中的一种。假如数据库是Oracle,则选择Sequence。

 

@GeneratedValue(strategy = GenerationType.AUTO) 

 

如果不特别指定,这是默认的主键生成策略。

 

原文见:http://xiaoqing.me/2013/02/14/jpa-id-generator/

分享到:
评论

相关推荐

    04_JPA详解_第一个JPA实例与JPA主键生成策略.zip

    **JPA(Java Persistence API)...综上所述,这个压缩包提供的教程详细讲解了JPA的基本概念,以及如何通过实例创建和管理JPA实体,特别是强调了主键生成策略的重要性,这对于理解和使用JPA进行数据库操作具有指导意义。

    JPA学习笔记-EJB-03JPA主键生成策略总结

    ### JPA主键生成策略详解 #### 一、概述 持久化对象的主键生成机制在JPA(Java Persistence API)中占据着重要的位置。它不仅关乎数据的唯一标识符如何确定,还与数据的存储效率及应用逻辑紧密相关。JPA通过`@...

    04_传智播客JPA详解_第一个JPA实例与JPA主键生成策略

    【标题】"04_传智播客JPA详解_第一个JPA实例与JPA主键生成策略"涉及的关键知识点主要包括Java Persistence API (JPA)的基础应用、首个JPA实例的创建以及JPA主键生成策略的理解和配置。JPA是Java平台上的一个标准,...

    JPA中的联合主键

    如果希望使用自动生成,可能需要结合`@GeneratedValue`注解和特定的生成器策略,但这在联合主键中并不常见,因为主键通常是业务相关的。 4. **关联和查询** 当使用联合主键时,关联其他实体或执行查询时,需要确保...

    java + spring boot +jpa 拦截器分库分表demo

    它涵盖了从JPA的基本使用到AOP拦截器的实现,再到分库分表策略的设计,对于提升大型项目的数据库性能有着重要的参考价值。开发者可以根据自身的业务场景,调整和优化这个示例,以满足特定的需求。

    JPA注解详解

    `@TableGenerator`注解用于配置主键生成器,特别是当主键生成策略为`GenerationType.TABLE`时。它允许我们自定义生成器的表名、分配大小、初始值等属性,以适应应用程序需求和数据库性能。 - `name`: 生成器的名称...

    openjpa实体标识的生成策略

    在OpenJPA中,实体标识(Entity Identifier)的生成策略是数据持久化过程中不可或缺的一部分,因为确保实体的唯一性对于数据库的正确性和一致性至关重要。OpenJPA提供了四种不同的策略来生成实体标识,使得开发者...

    使用表的id生成

    标题“使用表的id生成”涉及的是数据库管理和Java Persistence API (JPA) 中的一个关键概念:主键生成策略。在数据库表中,每个记录通常都有一个唯一的标识符,即主键,用于唯一地识别每条数据。在JPA中,有多种策略...

    JPA 标注 JPA标签手册

    - `@GeneratedValue`:指定主键生成策略,如自动序列或UUID等。 - `@Embeddable`:用于表示可嵌入的实体类,可以包含在其他实体中。 - `@EmbeddedId`:当实体使用复合主键时,标识复合主键类。 - `@Inheritance`...

    JPA的Id注解.docx

    **JPA(Java Persistence API)** 是Java平台上的一个标准,用于处理对象关系映射(ORM),它使得在Java应用程序中管理和持久化数据库记录变得...根据实际需求选择合适的主键生成策略,可以提高应用的效率和可扩展性。

    JPA学习笔记

    JPA提供了多种主键生成策略,如IDENTITY(自动增长)、SEQUENCE(序列)、TABLE(表生成)等。 3.4 字段、添加字段、添加表关联 `@Column`注解用于定义字段的数据库列映射,包括长度、是否可为空等属性。`@...

    JPA注解说明 详解

    4. **@GeneratedValue(strategy=GenerationType, generator="")**:定义主键生成策略。`strategy`可选值包括AUTO、IDENTITY、SEQUENCE和TABLE,分别代表ORM框架自动选择、基于数据库的Identity字段、基于Sequence...

    JPA教程,包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注

    - `@GeneratedValue`:用于自动生成主键值,支持多种策略如IDENTITY、SEQUENCE、TABLE等。 - `@Column`:定义实体属性与数据库列的映射,可以设置列名、长度、是否允许为空等属性。 - `@OneToMany`, `@ManyToOne`, `...

    01_传智播客JPA详解_全面阐释和精彩总结JPA

    - @GeneratedValue:定义主键生成策略,如自动增长、序列等。 - @Column:指定字段对应表中的列名和属性。 JPA还提供了丰富的查询API,包括简单的查询方法(find, getReference, merge, remove)和复杂的JPQL(Java...

    JPA注解的解释和说明.pdf

    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="repair_seq"):此注解用于指定主键生成策略,其中strategy参数指定了生成策略类型,如SEQUENCE、IDENTITY等。generator参数定义了序列生成器的名称。 ...

    JPA注解教程

    `@TableGenerator` 注解用于配置使用 `TABLE` 类型策略的主键生成器。这通常是在 `GeneratedValue` 注解的 `strategy` 属性被设置为 `GenerationType.TABLE` 时使用。 **1. 属性说明** - **name**: 主键生成器的...

    JPA大全之经典全集

    此外,还会涉及JPA的事务策略、事件监听器和性能调优技巧等内容,帮助开发者在实际项目中高效使用JPA。 ### JPA批注参考 JPA批注(Annotations)是声明式地将ORM元数据附加到Java类和属性上的方式。常见的批注有`@...

    表生成器 @TableGenerator

    在实际项目中,根据需求选择合适的主键生成策略很重要。例如,如果应用只在一个数据库实例上运行,数据库自带的序列功能可能更简单有效。然而,对于多实例部署或需要在不同数据库之间迁移的应用,`@TableGenerator` ...

    实体类生成器

    例如,Hibernate使用的`@Entity`表示这是一个实体类,`@Table`定义实体所对应的表名,`@Id`标识主键,`@GeneratedValue`控制主键生成策略等。 6. **其他辅助方法**:有时实体类会包含一些辅助方法,如`equals()`和`...

Global site tag (gtag.js) - Google Analytics