首页 > 解决方案 > Spring boot JPA 多对多,带有额外的列插入和更新问题

问题描述

这是我最初的问题。

Spring Data JPA 多对多,带有额外的用户和角色列

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

这是代码:

用户.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";
  }
}

我收到此错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:列'user_id'不能为空

标签: springhibernatespring-mvcspring-bootjpa

解决方案


推荐阅读