Весенняя загрузка много в одну ошибка отображения при обновлении объекта - PullRequest
0 голосов
/ 03 февраля 2019

Я работаю над пружинной загрузкой и использую отношения «многие к одному», как показано ниже:

@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<>();
 ....
}

MediaUser

@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 Ответ

0 голосов
/ 03 февраля 2019

Скорее всего, вы передаете 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...