Я работаю над пружинной загрузкой и использую отношения «многие к одному», как показано ниже:
@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]