JPA 指定主键生成策略
在 JPA(Java Persistence API)中,可以通过 @GeneratedValue 注解来指定主键生成策略。JPA 提供了几种常用的主键生成策略,主要包括 AUTO、IDENTITY、SEQUENCE 和 TABLE。这些策略允许 JPA 在持久化实体对象时自动生成主键值,而无需手动指定。
以下是如何使用 @GeneratedValue 注解并选择适合的主键生成策略:
1. @Id 和 @GeneratedValue 注解
首先,在 JPA 实体类中,通过 @Id 注解指定主键字段。然后,使用 @GeneratedValue 注解并通过 strategy 属性选择具体的生成策略。例如:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class ExampleEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO) // 指定主键生成策略
    private Long id;
    // 其他属性和方法
}
2. 主键生成策略类型
a) GenerationType.AUTO
- 
说明:
AUTO是 JPA 的默认策略。JPA 会根据底层数据库自动选择合适的主键生成策略。 - 
优点:数据库无关,便于跨数据库移植。
 - 
适用场景:当不确定数据库类型或希望让 JPA 自动管理主键生成方式时。
@GeneratedValue(strategy = GenerationType.AUTO) private Long id; 
b) GenerationType.IDENTITY
- 
说明:
IDENTITY策略依赖于数据库的自增字段功能,通常在 MySQL 等支持自增主键的数据库中使用。JPA 会在插入记录时生成主键值。 - 
优点:主键值由数据库自动递增生成,不需要额外的序列或表。
 - 
缺点:不支持批量插入(批量插入时每条记录需要单独插入)。
 - 
适用场景:当使用 MySQL 等支持自增主键的数据库时。
@GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; 
c) GenerationType.SEQUENCE
- 
说明:
SEQUENCE策略使用数据库的序列生成主键值,适用于支持序列的数据库,如 PostgreSQL、Oracle 等。 - 
优点:主键生成效率较高,支持批量插入。
 - 
配置:可以结合
@SequenceGenerator注解自定义序列。 - 
适用场景:适用于支持序列的数据库。
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "example_sequence") @SequenceGenerator(name = "example_sequence", sequenceName = "example_seq", allocationSize = 1) private Long id;- generator:指定生成器的名称。
 - sequenceName:对应数据库中的序列名称。
 - allocationSize:指定序列增量,默认为 50。设置为 1 可以确保序列值逐步增加。
 
 
d) GenerationType.TABLE
- 
说明:
TABLE策略使用一张专用的表来生成主键,表中存储了生成主键所需的序列值。这种方式与数据库类型无关,适用于任何数据库。 - 
优点:数据库无关,可以用于所有数据库。
 - 
缺点:性能较低,因为每次插入都需要查询并更新表中的序列值。
 - 
适用场景:在不支持
IDENTITY或SEQUENCE策略的数据库中使用。@GeneratedValue(strategy = GenerationType.TABLE, generator = "example_table_generator") @TableGenerator(name = "example_table_generator", table = "id_generator_table", pkColumnName = "gen_name", valueColumnName = "gen_value", pkColumnValue = "example_id", allocationSize = 1) private Long id;- table:指定用来存储主键值的表名。
 - pkColumnName:存储主键名的列。
 - valueColumnName:存储主键值的列。
 - pkColumnValue:指定主键生成器的名称。
 - allocationSize:设置增量(默认 50),可根据需求调整。
 
 
3. 选择主键生成策略的建议
- 使用 
AUTO策略可以在不同的数据库上自动选择合适的策略,适合数据库无关的应用。 - 使用 
IDENTITY策略适合 MySQL 等支持自增主键的数据库,但批量插入时性能可能受限。 - 使用 
SEQUENCE策略适合 Oracle、PostgreSQL 等支持序列的数据库,能提供更好的性能。 - 使用 
TABLE策略则适合不支持IDENTITY或SEQUENCE的数据库,尽管性能较低,但具有良好的兼容性。 
通过设置 @GeneratedValue 的策略属性,可以方便地让 JPA 根据具体需求来管理主键的生成方式。
                    
                
                
            
        
浙公网安备 33010602011771号