Spring JPA带id保存时报错:detached entity passed to persist

问题:

因项目JDK升级从11升到21,相应的Spring从2.x升级到3.x,Hiberante也从5.x升级到6.6. 然后在测试时发现如下代码报错

实体类User对应表users

java 复制代码
@Data
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(generator = "customerUUIDGenerator")
    @GenericGenerator(
            name = "customerUUIDGenerator",
            strategy = "org.example.id.customerUUIDGenerator"
    )
    private UUID id;

    @Version
    private int version;

    @Column(unique = true, nullable = false)
    private String username;

}

自定义id生成器

java 复制代码
public class CustomerUUIDGenerator implements IdentifierGenerator {
    
    @Override
    public Object generate(SharedSessionContractImplementor session, Object object) {
        final EntityPersister entityPersister = session.getEntityPersister( null, object );
		Object id = entityPersister.getIdentifier( object, session );
        return null != id ? id : UUID.randomUUID();
    }
}

代码中存在如下使用

java 复制代码
    ...
    public void addUser(UUID id, String name, String passwd) {
        User user = new User();
        user.setId(id);
        user.setUsername(name);
        userRepository.save(user);
        
    }

上面代码报错: detached entity passed to persist 或者StaleObjectStateException

原因

Hibernate在保存时会先查数据库有没有该数据

如果无则判断实体是否新创建的,判断流程主要如下

  1. 先判断id是否为空
  2. 如果version为null且id为外键
  3. 依据unsavedStrategy判断,尽在返回false时报错,否则存入数据库
  • id == null 则为true
  • id为自定义id且该Generator的allowAssignedIdentifiers方法返回true,则返回null
相关推荐
Zhang青山17 分钟前
使用 Nginx 轻松处理跨域请求(CORS)
java·后端
Victor3561 小时前
Redis(99)Redis的高可用性如何实现?
后端
Victor3561 小时前
Redis(98) Redis的安全更新如何进行?
后端
计算机学姐3 小时前
基于SpringBoot的动漫推荐系统【协同过滤推荐算法+词云图+排行榜】
java·vue.js·spring boot·后端·mysql·intellij-idea·推荐算法
韩立学长5 小时前
基于Springboot的影视评论网站的设计与实现58py6238(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
JavaTree20178 小时前
SpringMVC基础入门
后端
国服第二切图仔8 小时前
Rust中泛型函数实现不同类型数据的比较
开发语言·后端·rust
Anlici8 小时前
连载小说大学生课设 需求&架构
前端·javascript·后端
我命由我123458 小时前
Derby - Derby 服务器(Derby 概述、Derby 服务器下载与启动、Derby 连接数据库与创建数据表、Derby 数据库操作)
java·运维·服务器·数据库·后端·java-ee·后端框架
码事漫谈9 小时前
调试的艺术:从崩溃到洞察的全面指南
后端