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

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

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

EntityManager em = getEntityManager();
em.getTransaction.begin();

Book book = new Book("title", "isbn");
Category category = new Category("horror");

category.addBook(book);

em.persist(book);

em.getTransaction().commit();
em.getTransaction().close();

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

public void saveBook(Book book) {
    //what now
}

我应该做的是 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()等;

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

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

@RequiredArgsConstructor
@Service
public class BookService {

private final BookRepository bookRepository;

@Transactional
public void saveBook() {

   // just copying the logic from your question
   // but normally You would pass it as an argument to the method
    Book book = new Book("title", "isbn");
    Category category = new Category("horror");
    category.addBook(book);
    bookRepository.save(book);

    }
}

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

相关问题