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

Spring在更新对象时启动多对一映射错误

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

    我正在研究spring boot,并使用多对一关系,如下所示:

    @Entity
    @Table(name = "media_files")
    public class Media {
    
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;
    
      @OneToMany(mappedBy = "media", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval=true)
      private Set<MediaUser> users = new HashSet<>();
    
      ....
    
    }
    

    使用者

    @Entity
    @Table(name = "users")
    public class User {
    
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;
    
      @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval=true)
     private Set<MediaUser> users = new HashSet<>();
     ....
    }
    

    媒体用户

    @Entity
    @Table(name = "media_to_users")
    public class MediaUser implements Serializable {
    
       @Id
       @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
       @JoinColumn(name = "media_id")
       private Media media;
    
      @Id
      @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
      @JoinColumn(name = "user_id")
      private User user;
    
    
      @JsonBackReference
      @ManyToOne
      @JoinColumn(name = "parent_id")
      private Media parent;
      .....
     }
    

    我添加了这样的新实体

    media.getUsers().add(new MediaUser(media, user, parent));
    

    这很好,但是如果我尝试更新,就会出现错误

    //Get media from db
    Media media = mediaRepository.getOne(id);
    //clear already existing entries
    media.getUsers().clear();
    
    
       String[]  users = {"3","2"};
        for (String userIdStr: users) {
            User user = userRepository.getOne(Long.parseLong(userIdStr));
            if(user != null){
                 media.getUsers().add(new MediaUser(media, user, null));
                //mediaUserSet.add(new MediaUser(media, user, null));
            }
        }
    
     mediaRepository.save(media);
    

    错误是:

      java.sql.SQLIntegrityConstraintViolationException: Column 'user_id' cannot be null
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:117) ~[mysql-connector-java-8.0.13.jar:8.0.13]
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.13.jar:8.0.13]
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Maciej Kowalski    7 年前

    很可能你要通过 user1, user2 作为非持久性实体。

    你要么需要在保存之前保存它们 media 或将级联添加到注释中:

     @Id
     @ManyToOne(cascade = CascadeType.ALL)
     @JoinColumn(name = "user_id")
     private User user;
    

    你还需要确保如果 User 有一个 @OneToMay 关系 MediaUser 您必须将这些用户添加到集合中。

    String[]  users = {"3","2"};
    for (String userIdStr: users) {
        User user = userRepository.getOne(Long.parseLong(userIdStr));
        if(user != null){
            MediaUser mediaUser = new MediaUser(media, user, null) 
            user.getUsers().add(mediaUser);
            media.getUsers().add(mediaUser);
        }
    }