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控制器到数据库的流程,我整理了一张类图:
我对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
相关产品推荐
相关产品推荐

