2017-07-26 4 views
1

CRUDコントローラを設計しようとしていますが、ここでは挿入と削除操作は完全に機能しますが、更新は機能しません。更新のために提出すると、ユーザーテーブルのみが更新されますが、ロールテーブルは更新されません。Hibernate多対多リレーショナルテーブルで更新が動作しない

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());';という行を本当に理解できません。ユーザーエンティティに「新しい」ものを追加することはありません –

答えて

1


プライベート設定の役割=新しいHashSetの()このフィールドにカスケード= CascadeType.ALLを使用しよう.....私を助けてください。

私はあなたのisPresentがfalseを返すされていて、カスケードを使用しているようUserRepository.save(ユーザ)のみのユーザーではない役割を救うであろう実行されていると仮定しています= {CascadeType.MERGE}それは潜在的にあなたの問題を解決します 。

関連する問題