You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate OGM中自定义String生成器为何每次插入生成两条数据?

为啥插入操作会生成两条数据?

嘿,我来帮你揪出这个问题的根源!看你代码里的@GeneratedValue注解,你同时混用了strategy=GenerationType.IDENTITY和自定义的generator,这就是核心冲突点啦。

具体原因拆解

  • GenerationType.IDENTITY是让Hibernate依赖数据库的自增主键机制干活(比如MySQL的AUTO_INCREMENT),这时候Hibernate会先插一条不带ID的记录,让数据库自己生成ID,之后再把这个ID写回实体对象。
  • 但你又指定了generator="pt_sequence"也就是自定义的UUID生成器,Hibernate处理的时候就懵了:先调用你的生成器造个ID,插一条带ID的记录;然后又因为IDENTITY策略,再执行一次无ID的插入操作,这不就生成两条数据了嘛!

解决办法(二选一就行)

办法1:用你写的自定义UUID生成器(推荐)

把@GeneratedValue里的strategy=GenerationType.IDENTITY删掉,只保留generator配置:

@Id
@GeneratedValue(generator = "pt_sequence")
String id;

另外要确认@GenericGenerator里的strategy路径是对的(dao.StringIdGenerator要和你实际的包路径一致哦)。

办法2:用数据库自增的IDENTITY策略

要是不需要自定义UUID生成器,直接用数据库自增就行:

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
String id;

不过这里要注意,数据库表的ID字段得设成自增类型(比如MySQL的INT AUTO_INCREMENT),而且实体类的ID类型最好改成Long或者Integer,不然可能会有类型转换的坑。

额外要排查的点

要是改完注解还是有两条数据,那得检查下你的业务代码是不是不小心调用了两次save()或者persist()方法,或者在事务里重复执行了插入逻辑哦。


内容的提问来源于stack exchange,提问作者abubi abubi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:52:59