Hibernate获取自增主键ID的方法

本文介绍了在Hibernate中如何获取批量保存数据后,自增主键ID的方法。在理解save方法的执行过程后,可以在save操作完成后,立即使用getId()获取每个对象的自增ID。

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

今天在校内项目的过程中,遇到了前端队友提出需求:

  • 批量保存一组标签的数据
  • 并将这些标签插入数据库时自增产生的id封装成数组返回

这里就涉及到一个,如何获取自增时自动赋值的Id的问题。
让我们先来了解一下save方法的执行过程

  1. 它会先将对象加入缓存,从而变为持久化对象
  2. 查看映射文件,并根据指定的生成器为持久化对象分配Id
  3. 计划执行一个insert语句,把对象当前的属性值组装到insert语句中
  4. 当session清理缓存的时候,执行sql语句将数据进行保存

通过上面对save方法执行过程的了解,我们可以发现,当执行完save语句后,对象是有Id的,因此我们可以通过执行完save方法后,可以使用getId()的方法来获取自增过程对象所获得的Id

// java代码:
@Override
	public int createTag(Tag tag) {
   
   
		Session session = sessionFactory.openSession<
在使用 ShardingSphere 时,若遇到自主键配置不生效的问题,通常与分片策略、主键生成方式以及数据源配置相关。ShardingSphere 支持多种分布式主键生成策略,例如 `SNOWFLAKE` 和 `UUID`,但若希望继续使用数据库的自主键(如 MySQL 的 `AUTO_INCREMENT`),则需确保配置正确,避免因分片逻辑导致主键冲突或生成失败。 以下为排查与解决 ShardingSphere 中自主键配置不生效的常见方法: ### 1. 确保分片键与自主键配置正确 若表为分片表,自主键必须与分片策略相匹配。若主键字段未被设置为分片键,可能会导致主键冲突或无法正确获取生成的主键值。建议在配置中明确指定主键字段为分片键,如下所示: ```yaml tables: user: actual-data-nodes: ds$->{0..1}.user$->{0..1} table-strategy: standard: sharding-column: user_id sharding-algorithm-name: user-table-inline key-generator: column: user_id type: SNOWFLAKE ``` 若希望使用数据库自主键而非 ShardingSphere 提供的分布式主键生成策略,应将 `key-generator` 配置移除,确保框架不会尝试覆盖数据库的自逻辑[^1]。 ### 2. 配置 `useGeneratedKeys` 和 `keyProperty` 在使用 MyBatis 或 tk-mybatis 时,插入数据时若依赖数据库自主键,需确保 SQL 明确配置 `useGeneratedKeys` 和 `keyProperty`。例如: ```xml <insert id="insertUser" useGeneratedKeys="true" keyProperty="userId"> INSERT INTO user (name, email) VALUES (#{name}, #{email}) </insert> ``` 此配置确保在插入操作后,MyBatis 能正确读取数据库生成的主键值并设置到实体对象中[^3]。 ### 3. 检查数据库表结构 确认物理表中确实设置了 `AUTO_INCREMENT` 属性,并且主键字段未被 ShardingSphere 的分片策略覆盖。例如,在 MySQL 中应确保如下结构: ```sql CREATE TABLE user_0 ( user_id BIGINT AUTO_INCREMENT, name VARCHAR(255), PRIMARY KEY (user_id) ); ``` 如果多个分片表中存在相同的自主键值,将导致缓存或 ORM 框架中出现冲突,尤其是在使用 Hibernate 等具备二级缓存机制的框架时需格外注意[^4]。 ### 4. 避免主键冲突 若多个分片表均使用自主键,建议在数据库层面配置不同的自起始值和步长,以避免主键冲突。例如,在 MySQL 中可通过如下方式设置: ```sql -- 分片表 user_0 使用步长为 2,起始值为 1 ALTER TABLE user_0 AUTO_INCREMENT = 1; -- 分片表 user_1 使用步长为 2,起始值为 2 ALTER TABLE user_1 AUTO_INCREMENT = 2; ``` 同时在 ShardingSphere 配置中设置主键生成策略为 `NONE`,以避免框架干预主键生成过程。 ### 5. 日志与异常排查 若插入操作抛出 `ExecutorException` 或 `ParseCancellationException` 等异常,应检查日志中 SQL 执行详情及主键返回情况,确认是否因主键字段未正确映射或框架尝试读取错误的主键列导致问题[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值