我正在使用spring数据和hibernate作为JPA实现与spring boot。我是新手。 我有一个实体,我正在维护已存在的两个实体之间的映射,并且只有在特定更新时才会进入此映射中的条目。
@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:字段'genre_id'没有默认值
并且sql日志显示单行插入
Hibernate:插入song_genres(song_id)值(?)
如果没有级联,如何在一对多中插入多行?
答案 0 :(得分:0)
目前,我更改了实体定义,因为两者之间没有太大区别
@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得出结论,与春天的实施观点没有多大区别。
虽然this ain't best performance mysql-wise。如果Spring数据出现一个简单的单插入API,那将会很有趣。
答案 1 :(得分:0)
只需在此处为您的列表定义CASCADE类型&#34;列表类型&#34; 在列表中添加项目数并保留主实体。 您可以阅读更多相关信息here
例如:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "visitId")
private Collection<SampleData> lstSampleData;