我正在尝试设计一个 CRUD Controller ,在这里插入和删除操作工作正常,但更新不起作用。提交更新时,仅更新用户表,不更新角色表。
User.java
@Entity
@Table(name="users")
public class User implements UserDetails {
@Id
@GeneratedValue (strategy = GenerationType.AUTO)
private Long id;
@Column(length = 128, nullable = false)
private String firstName;
@Column(length = 128, unique = true, nullable = false)
private String email; // required; unique
@Column(unique = true, nullable = false, length=128)
private String name;
@Column(length = 128, nullable = false)
private String password; // required
@Column
private boolean enabled;
@JsonBackReference
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(
name = "company_user",
joinColumns = @JoinColumn(name = "userId"),
inverseJoinColumns = @JoinColumn(name = "companyId")
)
private Set<Company> companies = new HashSet<Company>();
@ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE})
@JoinTable(
name = "user_role",
joinColumns = @JoinColumn(name = "userId", referencedColumnName="id"),
inverseJoinColumns = @JoinColumn(name = "roleId", referencedColumnName="id")
)
private Set<Role> roles = new HashSet<Role>();
角色.java
@Entity
public class Role extends BaseObject {
@Column(length = 64)
private String description;
UserController.java
@PostMapping("/saveUser")
public void save(@ModelAttribute User user, BindingResult bindingResult, HttpServletRequest req, HttpServletResponse rsp) throws IOException {
user.setPassword(new BCryptPasswordEncoder().encode(user.getPassword()));
// LOGGER.info("--------------role User ID----------" + user.getRoles());
user.setRoles(user.getRoles());
userService.registerUser(user);
req.setAttribute("users", userService.findAllUsers());
req.setAttribute("mode", "USER_VIEW");
rsp.sendRedirect("showUser");
}
**UserService.Java**
public User registerUser(User user) {
Optional<User> exists = userRepository.findOneByName(user.getName());
return exists.isPresent() ? userRepository.save(exists.get().merge(user))
: userRepository.save(user);
}
如何克服这种情况?请帮助我......
最佳答案
尝试在此字段上使用cascade = CascadeType.ALL
私有(private) Set 角色 = new HashSet();
我假设您的 isPresent 返回 false 并且 UserRepository.save(user) 正在运行,这将仅保存用户而不是角色,因为您正在使用 cascade = {CascadeType.MERGE} 它可能会解决您的问题。
关于java - 更新在 Hibernate 多对多关系表中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45318068/