我正在设置 Spring Boot 应用程序 每次我发布这样的 JSON 数据时,都会尝试制作“添加用户菜单”:
MySQL 总是在 role_table
中创建新的 ADMIN 记录。
我的目的是仅在 role_table
中为 user_table
中的多个用户创建一条管理记录(一对曼尼)
到目前为止,我已经尝试修改几种 Spring JPA Annotation 不同类型的获取、关联和配置。
到目前为止,我的 MySql 数据库表的结果如下:
role_table. user_table
id. role. id username role_id
1 Admin 1 Tony 1
2. User 2. Buddy. 2
3. Guest. 3. Liaska. 3
4. Admin 4. Roy. 5
5. Admin. 5. Subrey. 4
6. User. 6. Alhanus. 7
7. Guest 7. Rsidi. 6
我期望 MySql 表中的结果如下:
role_table. user_table
id. role. id username role_id
1 Admin 1 Tony 1
2. User 2. Buddy. 2
3. Guest. 3. Liaska. 3
4. Roy. 1
5. Subrey. 3
6. Alhanus. 1
7. Rsidi. 1
谢谢大家
像这样的角色类:
public class Role implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name="id", length=8, unique = true)
private int id;
@Column(name = "role",nullable = false, unique = false)
private String role;
@OneToMany(mappedBy="role", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@Fetch(value = FetchMode.SUBSELECT)
private List<User> user = new ArrayList<User>();}
用户类别如下:
public class User implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name="user_id", length=8, unique = true)
private int user_id;
@Column(name = "username", nullable = false, unique = true)
private String username;
@Column(name = "password", nullable = false, unique = true)
private String password;
@ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private Role role;}
AdminController 类如下:
public class AdminController {
private static final Logger LOGGER = LoggerFactory.getLogger(AdminController.class);
@Autowired
private UserRepository userRepository;
@Autowired
private RoleRepository roleRepository;
private Role role = new Role();
@Autowired
private BCryptPasswordEncoder passwordEncoder;
@PreAuthorize("hasAnyRole('ADMIN')")
@PostMapping("/admin/add")
public String addUserByAdmin(@RequestBody User user){
String pwd = user.getPassword();
String encryptedPwd = passwordEncoder.encode(pwd);
user.setPassword(encryptedPwd);
if(userRepository.findByUsername(user.getUsername())==null){
userRepository.save(user);
} else {
return "user already exist
}
return "user added successfully ... ";
}
最佳答案
问题在于初始化您的 role
对象的持久性。在这里,您将获取 JSON 格式的用户对象,如下所示:
{"username": "Frantu", "password": "Pshycho8k8ss", "role" : {"role":"ADMIN"} }
没有为角色实体初始化 id 字段。
所以你的 User 对象会像
User {id=0, username = Frantu, password= Pshycho8k8ss , role = {id=0, role=ADMIN }
您没有在此处传递role.id
,因此 JPA 将为每个新请求创建一个具有新主键的新记录。
要解决此问题,首先,使用 role
属性从数据库获取 role
(如果存在)并将其设置为 User 对象。
Role dbRole = roleRepository.findByRole(user.getRole().getRole());
if(dbRole!=null){
user.setRole(dbRole);
}
userRepository.save(user);
关于java - Spring JPA关联实体创建相同的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56285165/