代码之家  ›  专栏  ›  技术社区  ›  VK321

Spring boot JPA多对多,带有额外的列插入和更新问题

  •  0
  • VK321  · 技术社区  · 7 年前

    这是我的第一个问题。

    Spring Data JPA Many to Many with extra column User and Roles

    现在我已经创建了正确的表,但无法使其用于更新。

    以下是代码:

    使用者JAVA

    @Entity
    @Table(name = "users")
    public class User {
    
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;
    
      private String username;
    
      @OneToMany(mappedBy="user", cascade = CascadeType.ALL, orphanRemoval = true,  fetch = FetchType.LAZY)
      private List<UserRole> roles;
      // getters and setters
    }
    

    角色JAVA

    @Entity
    @Table(name = "roles")
    public class Role {
    
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;
    
      private String name;
      // getters and setters
    }
    

    用户角色。JAVA

    @Entity
    @Table(name = "users_to_role")
    public class UserRole  implements Serializable {
    
      @Id
      @ManyToOne
      @JoinColumn(name = "user_id")
      private User user;
    
      @Id
      @ManyToOne
      @JoinColumn(name = "role_id")
      private Role role;
    
      private Date createdAt;
    
      public UserRole(){}
    
      public UserRole(User user, Role role, Date date) {
        this.user = user;
        this.role = role;
        this.createdAt = date;
      }
    
      // getters and setters
    }
    

    控制器

    @RestController
    public class APIController {
    
      @Autowired
      RoleRepository roleRepository;
    
      @Autowired
      UserRepository userRepository;
    
    
      @ResponseBody
      @RequestMapping(value = "create", method = RequestMethod.GET)
      public String create(){
    
        //Insert test - WORKING BUT NOT SURE IF ITS RIGHT WAY
        List<UserRole> userRoles = new ArrayList<>();
        Role role = roleRepository.getOne((long) 1);
    
        //Create user
        User user = new User();
        user.setUsername("test");
    
        //Create userRole
        userRoles.add(new UserRole(user, role, new Date()));
        user.setRoles(userRoles);
    
        userRepository.save(user);
    
        return "created";
    
      }
    
    
    
      @ResponseBody
      @RequestMapping(value = "edit", method = RequestMethod.GET)
      public String edit(){
    
        //Edit test - NOT working
        List<UserRole> userRoles = new ArrayList<>();
    
        Role role = roleRepository.getOne((long) 2);
    
        //get user from db
        User user = userRepository.getOne((long) 1);
    
        //Create userRole
        userRoles.add(new UserRole(user, role, new Date()));
    
        // WAS FIRST ATTEMPT using user.setRoles(userRoles); but got error and use
        //https://stackoverflow.com/questions/9430640/a-collection-with-cascade-all-delete-orphan-was-no-longer-referenced-by-the-ow
        //user.setRoles(userRoles);
    
        user.getRoles().clear();
        user.getRoles().addAll(userRoles);
    
    
        userRepository.save(user);
    
        return "done";
      }
    }
    

    我得到了这个错误:

    通用域名格式。mysql。jdbc。例外。jdbc4。MySQLIntegrityConstraintViolationException:列“user_id”不能为null

    0 回复  |  直到 7 年前