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

问题描述 投票:0回答:1

我正在处理一个单向 @OneToMany 关联,它利用“author_book”表作为中间表。但是,当尝试向作者添加新书籍以便在“author_book”表中生成新条目时,我必须首先检索所有以前的书籍。这个过程变得非常耗时,尤其是当作者拥有大量书籍时。就我而言,我无法使用双向 @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);
}
java spring hibernate spring-data
1个回答
0
投票

1。更改为@ManyToOne关系:

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

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

2。 本机 SQL 查询:

另一种选择是创建本机 SQL 查询来直接执行插入。它不会加载整个集合,因为您只需手动插入实体而不先加载它。

类似问题:Hibernate - 如何在不加载整个集合的情况下保留集合中的新项目

© www.soinside.com 2019 - 2024. All rights reserved.