我有3个数据库表(books
,authors
,books_authors
),它们由2个实体(Book
,Author
)表示,它们具有单向性多对多关系。每个Entity类都有自己的Repository
(扩展JpaRepository
)和Service
类。
目标是能够使用新的或现有的Book
保存新的或现有的Author
,也就是将孩子与父母一起保存。
当尝试使用Book
(Author
)提供的唯一保存方法用现有的JpaRepository
保存新的save
时,出现异常,说明< / p>
传递给持久对象的独立实体
由于Book
是新的,因此save
方法将使用persist
而不是merge
,并且persist
被级联(由于CascadeType.PERSIST
)给已经存在的孩子们有什么方法可以智能地级联保存,它基于当前的persist
使用merge
和Entity
而不是从父级那里级联下来的存储?我认为这是一个常见问题,因此必须有一个完善的解决方案。
从讨论中,我能够找到并理解,删除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;
}