簡體   English   中英

如何避免在多對多雙向關系中使用jpa將重復項插入數據庫

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM