我使用 Spring Data 和 Hibernate 作为 Spring Boot 的 JPA 实现。我对此很陌生。 我有一个实体,在其中维护两个已存在实体之间的映射,并且该映射中的条目仅在特定更新时出现。
@Entity
@Table(name = "song_genres")
public class SongGenres {
public SongGenres(Song song, List<Genre> genres) {
this.genres = genres;
this.song = song;
}
public SongGenres() {
// Empty constructor as required by hibernate
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "song_id")
private Song song;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "genre_id")
private List<Genre> genres;
public List<Genre> getGenres() {
return genres;
}
}
我正在尝试使用一次插入与歌曲相关的所有流派值
SongGenres songGenres = new SongGenres(song, genres);
songGenresRepository.save(songGenres);
但这给出了一个错误
java.sql.SQLException: Field 'genre_id' doesn't have a default value
并且 SQL 日志显示单行插入
Hibernate: insert into song_genres (song_id) values (?)
如何在不级联的情况下实现一对多的多行插入?
最佳答案
目前,我更改了实体定义,因为两者之间没有太大区别
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "chapter_id")
private Chapter chapter;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "genre_id", nullable = false)
private Genre genre;
保存操作变为
List<ChapterGenre> chapterGenres = new ArrayList<>();
for (Genre genre : genres) {
chapterGenres.add(new ChapterGenre(chapter, genre));
}
chapterGenreRepository.save(chapterGenres);
来自this one ,结论是从 spring 的实现角度来看没有太大区别。
虽然this ain't best performance mysql-wise 。如果 spring data 能提供一个简单的单一插入 API,那将会很有趣。
关于mysql - 带有 hibernate 的 Spring 数据 : multiple row insert in one-to-many entity without cascade,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40904242/