2017-07-26 1 views
1

J'essaye de concevoir un contrôleur de CRUD, ici l'opération d'insertion et de suppression fonctionnant parfaitement mais la mise à jour ne fonctionne pas. Lors de la soumission pour la mise à jour, seule la table des utilisateurs est mise à jour mais la table des rôles n'est pas mise à jour.Mise à jour ne fonctionnant pas dans Hibernate beaucoup à beaucoup de table relationnelle

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

Comment puis-je surcompensation e cette situation? S'il vous plaît aidez-moi .....

+1

Je ne comprends pas vraiment la ligne 'user.setRoles (user.getRoles());'; il n'ajoute rien de nouveau à l'entité utilisateur –

Répondre

1

Essayez d'utiliser cascade = CascadeType.ALL sur ce champ
privé Définir les rôles = new HashSet();

Je suppose votre IsPresent retourne faux et UserRepository.save (utilisateur) est en cours d'exécution qui ne sauvegarder que les utilisateurs ne rôles que vous utilisez cascade = {} CascadeType.MERGE Il pourrait résoudre votre problème .