簡體   English   中英

如何在 Spring 引導中使用 @ManyToMany 正確保存實體?

[英]How to correctly save entity with @ManyToMany in Spring Boot?

我知道如何在純 Hibernate 中保持具有 @ManyToMany 關系的實體。 但是如何在 Spring 中正確地做到這一點?

在 hibernate 中,這將是:

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); 是否足以保存此 @ManyToMany 關系? 我不需要 addBook、addCategory、removeBook 等其他方法嗎?

先感謝您。

Spring 的存儲庫只是包裝 entityManager 並執行它的 persist 方法。 您可以查看默認實現

這就是為什么“純休眠”中的任何可能都可以通過帶有幾個注釋的 Spring 存儲庫實現

注意 1使用 spring 您很可能會用@Transactional注釋替換事務樣板,這就是為什么您需要小心在方法之間傳遞的實體。

注2你所說的“純休眠”代碼實際上是“純JPA”,沒有提到hibernate。 可能 hibernate 是您的 JPA 實現。

使用 Spring 引導來處理您的實體的 state 管理的標准方法是:

  1. 創建用 @Entity 注釋的實體類(我想你已經完成了) - 例如 Book.class 實體;
  2. 創建擴展 JPARepository<T,ID> 的存儲庫接口,其中 T 是您的實體 class(為 Book 創建一個,為 Category 創建另一個),ID 是您的實體 class 的主鍵。 這將為您提供許多有用的存儲庫方法的默認實現的優勢,例如 save()、findOneById() 等;
public interface BookRepository extends JPARepository<Book, Long> {}

假設您已將 Long 設置為圖書實體的主鍵;

  1. 在服務 class 中注入存儲庫;

  2. 現在您可以使用您的服務 class 和方法,如下所示:

@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 關系中,您必須將類別添加到圖書類別集合中,反之亦然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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