[英]how to avoid inserting duplicates into DB using jpa in a many to many bidirectional relationship
在休眠狀態下,我與實體Book and Author有多對多的雙向關系,一個Author可以寫很多書,而一本書可以有很多作者。 嘗試與數據庫中已經存在的作者保存一本新書時出現該問題。 hibernate將使用相同的作者和新ID在數據庫中創建一條新記錄,我該如何將新書引用數據庫中的現有作者而不是創建新書?
我的課看起來像這樣。
@Entity
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id")
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "author_id")
private Long id;
@Column(name = "name")
private String name;
@ManyToMany(cascade = CascadeType.ALL, mappedBy = "authors")
private Set<Book> books = new HashSet<>();
書班
@Entity
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "book_id")
private Long id;
@Column(name = "name")
private String name;
@Column(name = "abstract")
private String bookAbstract;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "book_author",
joinColumns = {@JoinColumn(name = "book_id")},
inverseJoinColumns = {@JoinColumn(name = "author_id")}
)
private Set<Author> authors = new HashSet<>();
我將JSON對象發送到其他控制器,然后保存該書
{
"name" : "Name of the Book",
"bookAbstract" : "an abstract",
"authors" : [
{"name":"Author1"},
{"name":"Author2"},
{"name":"Author3"}]}
我將JSON轉換為Java對象,並使用JPArepository中的save()將其保存,假設Author1已存在於數據庫中,下面的代碼將創建Author1的新記錄,
Book book = objectMapper.readerFor(Book.class).readValue(input);
bookRepository.save(book);
好吧,我可以防止重復出現的情況是:
1)嘗試同時獲取每個作者的記錄。 假設您可以將存儲庫注入到映射器中,那么:
Book book = assembleBook(input);
for(String authorName: input.getAuthors){
Author author = repository.getAuthorByName(authorName);
if(author == null){
author = new Author(authorName);
}
author.getBooks().add(book);
book.getAuthors.add(author);
}
2)您可能需要執行bookRepository.merge(book);
,除非此調用與組裝對象的事務在同一筆交易中,否則請bookRepository.saveOrUpdate(book);
應該做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.