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
相关产品推荐
相关产品推荐

