【发布时间】:2020-10-24 05:16:09
【问题描述】:
我有一个用户类和角色类和用户角色类。现在,每次我尝试添加一个具有一组已经存在的角色的新用户时,它都会引发一个正确的唯一错误。但理想情况下,如果新角色已经存在,它不应该尝试保存它。下面我添加了我所有的表格和保存方法。
@Table(name = "t_user")
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "mobile_number")
private String mobileNumber;
@Column(name = "email")
private String email;
@Column(name = "first_name")
private String firstName;
@Size(max = 100)
@NotBlank(message = "Last name can not be empty")
@Column(name = "last_name")
private String lastName;
@Column(name = "is_archived")
private Boolean isArchived = false;
@Column(name = "qualification")
private String qualification;
@JsonIgnore
@Column(name="password")
private String password;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "t_user_role", joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {
@JoinColumn(name = "role_id", referencedColumnName = "id")})
private Set<Role> roles = new HashSet<>();
}
@Data
@Table(name = "m_role")
@Entity
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name="name")
private String name;
}
@Data
@Table(name = "t_user_role")
@Entity
public class UserRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
@ManyToOne
@JoinColumn(name = "role_id")
private Role role;
}
我保存用户的方法:
User newUser = new User();
newUser.setFirstName(user.getFirstName());
newUser.setLastName(user.getLastName());
newUser.setEmail(user.getEmail());
newUser.setMobileNumber(user.getPassword());
newUser.setPassword(bcryptEncoder.encode(user.getPassword()));
newUser.setRoles(user.getRoles());
return userRepository.save(newUser);
}
以下是创建用户的post请求格式:
{
"firstName":"first",
"lastName":"name",
"email":"email@gmail.com",
"mobileNumber":"1110122223",
"password":"1234567890",
"roles":[{
"name":"ADMIN"
}]
}
我不想插入应该是理想的角色(如果存在)。但这是我在使用角色实现 Spring Security 时发现的标准方式
【问题讨论】:
-
你能添加例外吗?没有它我们就没有想法
-
Lombok @Data 包含 @EqualsAndHashCode(需要一个 Set)。你不希望出现这种情况。在您的课程中,键入 alt-insert 并实现 Equals() 和 HashCode()。可能还有另一个问题,但这引起了我的注意。 thorben-janssen.com/…
-
即将到来的异常是数据完整性违规异常,因为角色管理员已经存在
-
使用
save方法调用会在数据库中插入记录,并且由于唯一性约束会抛出错误。如果您想防止重复值,那么您可以在调用保存方法之前检查并显示您的自定义消息 -
但是我在 t_user_role 表而不是角色表上进行连接调用
标签: java spring-boot spring-security spring-data-jpa spring-data