我正在研究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]