【发布时间】:2022-11-30 04:18:58
【问题描述】:
我在添加具有角色的用户后插入具有角色的新用户时遇到问题。
我首先创建了一个 ROLE_USER 用户和一个 ROLE_ADMIN 用户。
当我试图用它的角色创建一个新的时,我得到了密钥的重复条目错误。
我该如何解决?
这是下面显示的类
@Entity
@Table(name = "Roles")
@NoArgsConstructor
@Getter
@Setter
public class Role extends IdBasedEntity implements Serializable {
@Enumerated(EnumType.STRING)
@Column(length = 20, unique = true)
private ERole name;
public Role(ERole name){
this.name = name;
}
public ERole getName() {
return name;
}
}
@Entity
@Table(name = "Users")
@Data
@NoArgsConstructor
public class User extends IdBasedEntity implements Serializable {
@Column(unique = true, nullable = false)
private String username;
@Column(unique = true, nullable = false)
private String email;
private String password;
@ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinTable(name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>();
}
public enum ERole {
ROLE_USER,
ROLE_ADMIN
}
@MappedSuperclass
@Getter
@Setter
public class IdBasedEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer id;
}
@Entity
@Table(name = "RefreshToken")
@Data
public class RefreshToken extends IdBasedEntity implements Serializable {
@OneToOne
@JoinColumn(name = "user_id", referencedColumnName = "id")
private User user;
@Column(nullable = false, unique = true)
private String token;
@Column(nullable = false)
private Instant expiryDate;
}
这是我的代码 sn-p,如下所示。
@PostMapping("/signup")
public ResponseEntity<?> registerUser(@RequestBody SignUpRequest signUpRequest) {
String username = signUpRequest.getUsername();
String email = signUpRequest.getEmail();
String password = signUpRequest.getPassword();
Set<String> strRoles = signUpRequest.getRoles();
Set<Role> roles = new HashSet<>();
if(userService.existsByUsername(username)){
return ResponseEntity.badRequest().body(new MessageResponse("Error: Username is already taken!"));
}
if(userService.existsByEmail(email)){
return ResponseEntity.badRequest().body(new MessageResponse("Error: Email is already taken!"));
}
User user = new User();
user.setEmail(email);
user.setUsername(username);
user.setPassword(encoder.encode(password));
if (strRoles != null) {
strRoles.forEach(role -> {
switch (role) {
case "ROLE_ADMIN":
roles.add(new Role(ERole.ROLE_ADMIN));
break;
default:
roles.add(new Role(ERole.ROLE_USER));
}
});
}else{
roles.add(new Role(ERole.ROLE_USER));
}
user.setRoles(roles);
userService.saveUser(user); // ERROR LINE
return ResponseEntity.ok(new MessageResponse("User registered successfully!"));
}
这是我的错误,如下所示。
// Create User
java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'ROLE_USER' for key 'roles.UK_ofx66keruapi6vyqpv6f2or37'
// Create Admin
java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'ROLE_ADMIN' for key 'roles.UK_ofx66keruapi6vyqpv6f2or37'
【问题讨论】:
标签: java spring-boot