带有hibernate的Spring数据:在没有级联的一对多实体中插入多行

时间:2016-12-01 06:48:32

标签: mysql hibernate jpa spring-data spring-data-jpa

我正在使用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)值(?)

如果没有级联,如何在一对多中插入多行?

2 个答案:

答案 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;