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

Spring Boot 6项目更新用户角色时触发Hibernate标识符修改异常的问题求助

Spring Boot 6项目更新用户角色时触发Hibernate标识符修改异常的问题求助

我正在尝试用Spring Boot 6搭建一个带登录功能和用户角色的后端模板项目,目前定义了User和UserRole两个实体类,具体代码如下:

User实体类

package com.example.demo.model;

import jakarta.persistence.*;
import lombok.Data;
import lombok.EqualsAndHashCode;

@Entity(name = "user")
@Table(name = "user")
@Data
@EqualsAndHashCode(callSuper = true)
public class User extends AbstractEntity {
    @Column(name = "mail", nullable = false, unique = true)
    private String mail;

    @Column(name = "first_name", nullable = false)
    private String firstName;

    @Column(name = "last_name", nullable = false)
    private String lastName;

    // ...

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_role_id", nullable = false)
    private UserRole userRole;
}

UserRole实体类

package com.example.demo.model;

import com.example.demo.enums.UserRoleName;
import jakarta.persistence.*;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Set;

@Entity(name = "user_role")
@Table(name = "user_role")
@Data
@EqualsAndHashCode(callSuper = true)
public class UserRole extends AbstractEntity {
    @Column(name = "name", nullable = false, unique = true)
    @Enumerated(EnumType.STRING)
    private UserRoleName name;

    @Column(name = "access_level", nullable = false)
    private Integer accessLevel;

    @OneToMany(mappedBy = "userRole", fetch = FetchType.LAZY, orphanRemoval = true)
    private Set<User> users;

    public UserRole() {
        super();
    }
}

这两个实体都继承自我定义的AbstractEntity基类:

package com.example.demo.model;

import jakarta.persistence.*;
import lombok.Data;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.util.Date;
import java.util.UUID;

@MappedSuperclass
@Data
public abstract class AbstractEntity {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.UUID)
    protected UUID id;
    @Column()
    @CreationTimestamp
    protected Date created;
    @Column()
    @UpdateTimestamp
    protected Date updated;

    protected AbstractEntity() {
    }
}

现在我遇到一个持久化问题:当尝试更新用户的角色(修改User关联的UserRole)时,会抛出以下异常:

org.hibernate.HibernateException: identifier of an instance of com.example.demo.model.UserRole was altered from 2ee569d5-91dc-4eb9-82f7-7ce7d76b158a to 150179b8-a235-452f-aaeb-a536174a0f94

在控制器中,我使用ModelMapper来做DTO到实体的转换,代码如下:

private User convertToEntity(UserDto userDto) {
    User user;
    if (userDto.getId() != null) {
        user = userService.getById(UUID.fromString(userDto.getId()))
                .orElseThrow(() -> new NotFoundException("User not found from ID"));
    } else {
        // ...
    }
    modelMapper.map(userDto, user);
    return user;
}

为了更清晰展示从REST控制器到数据库的流程,我整理了一张类图:
Class diagram

我对JPA的掌握还不够扎实,感觉问题就在眼前,但完全不知道该从哪里着手排查。最后附上项目pom.xml中的依赖配置:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>3.1.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
        <version>3.1.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
        <version>3.2.4</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-crypto</artifactId>
        <version>6.2.3</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.2</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-jpamodelgen</artifactId>
        <version>6.2.7.Final</version>
    </dependency>
    <dependency>
        <groupId>org.modelmapper</groupId>
        <artifactId>modelmapper</artifactId>
        <version>3.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.11.0</version>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.1.0</version>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.12.3</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.2.2</version>
    </dependency>
</dependencies>

备注:内容来源于stack exchange,提问作者JaisBC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:04:31