hibernate 如何在单向@OneToMany中添加子记录而不检索以前的记录

6tqwzwtp  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(109)

我正在处理一个单向的@OneToMany关联,它使用“author_book”表作为中间表。然而,当试图将一本新书添加到一个Author中,以便在“author_book”表中生成一个新条目时,我必须首先检索所有以前的Books。这个过程很耗时,特别是当作者有大量书籍的时候。在我的情况下,我不能使用双向@OneToMany关联。有没有一种更有效的方法来实现这一点,使用单向的方法?
作者单位:

@Entity
public class AuthorEntity {
   @Id
   private long id;

   @OneToMany
   @JoinTable(name = "author_book", joinColumns = @JoinColumn(name = "id_author"),
              inverseJoinColumns = @JoinColumn(name = "id_book"))
   private Set<BookEntity> books;
}

和图书实体:

@Entity
public class BookEntity {
   @Id
   private long id;
}

添加新书

public void addBook(BookEntity book) {
    AuthorEntity author = authorRepository.findById(authorId);
    author.getBooks().add(book);
    entityManager.merge(author);
}
3vpjnl9f

3vpjnl9f1#

1.更改为@ManyToOne关系:

一种方法是将关系从@OneToMany修改为@ManyToOne。通过这样做,你可以建立一个从书到作者的关系。当添加一本新书时,您可以简单地设置这本书的作者,Hibernate将有效地执行单个insert语句。如果您不需要直接从作者导航到他们的书籍,则此方法非常有效。

BookEntity b = new BookEntity();
    AuthorEntity a = em.getReference(AuthorEntity.class, 1L);
    b.setAuthor(a);
    b.setId(342L);
    em.persist(b);

2.原生SQL接口

另一种选择是创建一个原生SQL查询来直接执行插入。它不会加载整个集合,因为您只需手动插入实体,而无需先加载它。
类似问题:Hibernate - How to persist a new item in a Collection without loading the entire Collection

相关问题