[英]Does JPA framework saves One-To-Many Relationship automatically?
import javax.persistence.*;
import java.io.Serializable;
import java.util.Set;
@Entity
@Table(name = "books")
public class Book implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String author;
@Column(unique = true)
private String isbn;
@OneToMany(mappedBy = "book", fetch = FetchType.LAZY,
cascade = CascadeType.ALL)
private Set<Page> pages;
public Book() {
}
public Book(String title, String author, String isbn) {
this.title = title;
this.author = author;
this.isbn = isbn;
}
// getters and setters, equals(), toString() .... (omitted for brevity)
}
和
import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "pages")
public class Page implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private int number;
private String content;
private String chapter;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "book_id", nullable = false)
private Book book;
public Page() {
}
public Page(int number, String content, String chapter, Book book) {
this.number = number;
this.content = content;
this.chapter = chapter;
this.book = book;
}
// getters and setters, equals(), toString() .... (omitted for brevity)
}
並將其存儲:
// create a new book
Book book = new Book("Java 101", "John Doe", "123456");
// save the book
bookRepository.save(book);
// create and save new pages
pageRepository.save(new Page(1, "Introduction contents", "Introduction", book));
pageRepository.save(new Page(65, "Java 8 contents", "Java 8", book));
pageRepository.save(new Page(95, "Concurrency contents", "Concurrency", book));
問題是:我真的需要手動save
每一頁嗎? 我可以只使用 java collections 然后保存主要實體,如:
book.pages.add(new Page(1, "Introduction contents", "Introduction", book));
book.pages.add(new Page(65, "Java 8 contents", "Java 8", book));
book.pages.add(new Page(95, "Concurrency contents", "Concurrency", book));
bookRepository.save(book);
該示例取自https://attacomsian.com/blog/spring-data-jpa-one-to-many-mapping
而且我想知道存儲關系的正確和最佳方式,這就是為什么我在這里問而不是自己嘗試,因為看起來這篇文章誤導了很多人
這就是Book#pages
上的cascade
作用。 當您將其配置為CascadeType.ALL
時,這意味着當您使用EntityManager
在Book
上進行persist()
時,它將自動在其所有Page
上調用persist()
。
禁用cascade
后,您必須調用以下命令來保存新書及其所有頁面:
entityManager.persist(book);
entityManager.persist(page1);
entityManager.persist(page2);
....
entityManager.persist(pageN);
但是啟用級聯后,您只需調用以下內容,因為 Page 上的所有persist()
將被級聯以自動調用。
entityManager.persist(book);
由於 spring-data-jpa 存儲庫內部只是使用相同的EntityManager
來保存相同事務的對象,因此如果啟用了級聯,您只需調用以下命令來保存書籍及其頁面:
Book book = new Book("Java 101", "John Doe", "123456");
book.pages.add(new Page(1, "Introduction contents", "Introduction", book));
book.pages.add(new Page(65, "Java 8 contents", "Java 8", book));
book.pages.add(new Page(95, "Concurrency contents", "Concurrency", book));
bookRepository.save(book);
否則,如果禁用級聯,則必須調用以下命令來保存 Book 及其頁面:
Book book = new Book("Java 101", "John Doe", "123456");
bookRepository.save(book);
pageRepository.save(new Page(1, "Introduction contents", "Introduction", book));
pageRepository.save(new Page(65, "Java 8 contents", "Java 8", book));
pageRepository.save(new Page(95, "Concurrency contents", "Concurrency", book));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.