Hibernate jpa获取自增主键Id

本文介绍在Spring+Hibernate+JPA项目中,如何在保存实体后获取自增主键Id进行后续操作。主要探讨了JPA主键生成策略,包括AUTO、IDENTITY(数据库自增,Oracle不支持)、SEQUENCE(序列生成,MySQL不支持)和TABLE(特定表生成主键)。当使用IDENTITY策略时,保存实体后可以直接从实体获取主键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中使用Spring +Hibernate+jpa。有场景需要保存实体后获取实体的主键进行下一步的操作。
经过查询资料以及参考通过修改主键注解的方式。即

@DocumentId
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

实际就是strategy 的修改,查询源码:

public enum GenerationType{
    /**
     * Indicates that the persistence provider must assign
     * primary keys for the entity using an underlying
     * database table to ensure uniqueness.
     */
    TABLE,
    /**
     * Indicates that the persistence provider must assign
     * primary keys for the entity using a database sequence.
     */
    SEQUENCE,
    /**
     * Indicates that the persistence provider must assign
     * primary keys for the entity using a database identity column.
     */
    IDENTITY,
    /**
     * Indicates that the persistence provider should pick an
     * appropriate strategy for the particular database. The
     * <code>AUTO</code> generation strategy may expect a database
     * resource to exist,
在使用 JPA 时配置主键,可以通过 `@GeneratedValue` 注解来实现。该注解用于指定主键的生成策略,支持多种生成方式,适用于不同数据库和业务场景的需求。 ### 使用 GenerationType.AUTO 自动检测数据库主键类型 当使用 `@GeneratedValue` 注解时,可以将主键生成策略设置为 `GenerationType.AUTO`。该策略会由 JPA 自动检测数据库的主键类型,并选择合适的生成方式。例如,在 MySQL 中,该策略默认会使用数据库的自机制来生成主键值: ```java @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; ``` 这种方式适用于大多数场景,但在某些数据库中可能不会使用自机制,而是通过中间表来模拟主键生成,这可能会导致与预期不符的结果。 --- ### 显式指定 GenerationType.IDENTITY 使用数据库自 为了确保主键使用数据库的自功能,可以直接指定 `GenerationType.IDENTITY` 策略。该策略依赖数据库的自列(如 MySQL 的 `AUTO_INCREMENT`),适用于单表主键的情况: ```java @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ``` 这种方式确保了主键值由数据库自动生成,避免了中间表等额外开销,是使用自主键时的推荐方式。 --- ### 复合主键中使用自字段 在某些复杂业务场景中,可能需要使用复合主键。复合主键可以通过 `@IdClass` 或 `@EmbeddedId` 来定义,而其中的自字段仍然可以使用 `@GeneratedValue` 注解: ```java @Entity @IdClass(SearchVecPK.class) public class SearchVecEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Id private int part; private String appId; } public class SearchVecPK implements Serializable { private Long id; private int part; } ``` 上述代码中,`id` 字段被设置为自主键,而 `part` 字段作为复合主键的一部分,两者共同构成主键[^3]。 --- ### 配置 EntityManagerFactory 时的注意事项 在 Spring 配置中,确保 `LocalContainerEntityManagerFactoryBean` 的配置正确,以支持主键生成策略。通常不需要额外配置即可支持数据库自,但需要确保数据库表结构与实体类定义一致: ```xml <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <!-- 数据库连接配置等其他属性 --> </bean> ``` 如果使用的是 Hibernate 作为 JPA 提供者,可以进一步配置 `hibernate.id.generator.type` 属性来控制主键生成策略。 --- ### 相关问题 1. 如何在 JPA 中实现自定义主键生成策略? 2. JPA 中 GenerationType.AUTO 和 GenerationType.IDENTITY 的区别是什么? 3. 如何在 JPA 中使用复合主键并结合自字段? 4. 如何处理 JPA主键生成策略与数据库不兼容的问题? 5. JPA 是否支持在非主键字段上使用自策略?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值