更新不工作在休眠多对多关系表

问题描述:

我想设计一个CRUD控制器,在这里插入和删除操作完美,但更新不起作用。提交更新时,只更新用户表,但不更新角色表。更新不工作在休眠多对多关系表

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>(); 

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); 
    } 

我怎样才能overcom这种情况?请帮我.....

+1

我真的不明白'user.setRoles(user.getRoles());';它不会向用户实体添加任何“新” –

尝试在这一领域
私订角色=新的HashSet()使用级联= CascadeType.ALL;

我假设你isPresent被返回false和UserRepository.save(用户)正在运行,这将仅保存用户没有角色,你正在使用级联= {} CascadeType.MERGE 这将有可能解决您的问题。