用新的或现有的子实体保存新的或现有的父实体

时间:2020-01-10 00:09:43

标签: java hibernate spring-boot jpa spring-data

我有3个数据库表(booksauthorsbooks_authors),它们由2个实体(BookAuthor)表示,它们具有单向性多对多关系。每个Entity类都有自己的Repository(扩展JpaRepository)和Service类。

目标是能够使用新的或现有的Book保存新的或现有的Author,也就是将孩子与父母一起保存。

当尝试使用BookAuthor)提供的唯一保存方法用现有的JpaRepository保存新的save时,出现异常,说明< / p>

传递给持久对象的独立实体

由于Book是新的,因此save方法将使用persist而不是merge,并且persist被级联(由于CascadeType.PERSIST)给已经存在的孩子们有什么方法可以智能地级联保存,它基于当前的persist使用mergeEntity而不是从父级那里级联下来的存储?我认为这是一个常见问题,因此必须有一个完善的解决方案。

从讨论中,我能够找到并理解,删除CascadeType.PERSIST可以解决分离的实体问题,但不能使您与子代一起保存子代。另外,save可以替换为merge(需要使用EntityManager),但这会提出为什么为什么还要save还是基于我阅读的讨论而烦恼,可能不是解决方案。


books

id,姓名

authors

id,姓名

books_authors

id,book_id,author_id


@Entity
@Table(name = "books")
public class Book {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(insertable = false, name = "id", nullable = false)
private Long id;

@ManyToMany(
    fetch = FetchType.EAGER,
    cascade = {
        CascadeType.PERSIST,
        CascadeType.MERGE,
        CascadeType.REFRESH,
        CascadeType.DETACH
    })
@JoinTable(
    name = "books_authors",
    joinColumns = @JoinColumn(name = "book_id"),
    inverseJoinColumns = @JoinColumn(name = "author_id"))
private Set < Author > authors;

}

@Entity
@Table(name = "authors")
public class Author {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(insertable = false, name = "id", nullable = false)
    private Long id;

    @Column(name = "name", nullable = false)
    private String name;

}

0 个答案:

没有答案
相关问题