mysql - 带有 hibernate 的 Spring 数据 : multiple row insert in one-to-many entity without cascade

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

我使用 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/

相关文章:

java - 代码生成时找不到 Hibernate MultiMap

java - 无法延迟初始化角色集合无法初始化代理 - 无 session

mysql - 将 Spring Batch MyISAM 序列表迁移到 InnoDB

java - 未能延迟初始化角色 [] 的集合,无法初始化代理 - 无 session

mysql - 将 MySQL 表从一台服务器导入到另一台服务器

java - Hibernate 尝试在外键列中插入 null

java - Hibernate Criteria Api 子查询

JPA EntityManager 为什么merge() 不管理实例?

mysql - 如何在mysql中搜索日期

mysql - MySQL 中的 SELECT 树