java—如何在SpringBoot中正确保存带有@manytomany的实体?

yvgpqqbh  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(417)

我知道如何在纯hibernate中用@manytomany关系持久化实体。但如何在Spring正确地做到这一点呢?
在休眠状态下:

  1. EntityManager em = getEntityManager();
  2. em.getTransaction.begin();
  3. Book book = new Book("title", "isbn");
  4. Category category = new Category("horror");
  5. category.addBook(book);
  6. em.persist(book);
  7. em.getTransaction().commit();
  8. em.getTransaction().close();

像这样的。但是Spring呢,假设我有 @Service 从@restcontroller接收book或bookdto。

  1. public void saveBook(Book book) {
  2. //what now
  3. }

我应该做的是 bookRepository.save(book); 足以挽救这个“多人关系”吗?我不需要像addbook,addcategory,removebook等其他方法吗。?
先谢谢你。

3lxsmp7m

3lxsmp7m1#

spring的存储库除了 Package entitymanager并执行它的persist方法之外什么也没做。您可以看看默认实现
这就是为什么“纯hibernate”中的任何可能都可以通过spring的存储库和几个注解实现
注1:使用Spring时,最有可能使用 @Transactional 注解,这就是为什么需要小心在方法之间传递的实体。
注意2您所说的“纯hibernate”实际上是“纯jpa”,没有提到hibernate。hibernate可能是您的jpa实现。

k3bvogb1

k3bvogb12#

使用spring boot处理实体状态管理的标准方法是:
创建带有@entity注解的实体类(我想您已经完成了),例如book.class实体;
创建扩展jparepository<t,id>的存储库接口,其中t是实体类(为book创建一个,为category创建另一个),id是实体类的主键。这将为您提供许多有用的存储库方法的默认实现的优势,如save()、findonebyid()等;

  1. public interface BookRepository extends JPARepository<Book, Long> {}

假设已将long设置为book实体的主键;
在服务类中注入存储库;
现在您可以像这样使用服务类和方法:

  1. @RequiredArgsConstructor
  2. @Service
  3. public class BookService {
  4. private final BookRepository bookRepository;
  5. @Transactional
  6. public void saveBook() {
  7. // just copying the logic from your question
  8. // but normally You would pass it as an argument to the method
  9. Book book = new Book("title", "isbn");
  10. Category category = new Category("horror");
  11. category.addBook(book);
  12. bookRepository.save(book);
  13. }
  14. }

回答你的第二个问题-是的,你必须注意保持两个实体的关系同步,这是无法摆脱的。所以在@manytomany关系中,您必须将category添加到book categories集合,反之亦然。

展开查看全部

相关问题