0
我一直在努力研究Hibernate,從來沒有真正注意flush()方法直到昨天。Hibernate flush()和Cascade.PERSIST
我明白,提交事務時會自動調用flush()。
我正在處理一個示例庫管理系統。 作者和圖書之間的關係是多對多
在Author.java
@Fetch(FetchMode.SELECT)
@ManyToMany(mappedBy="authors", cascade={CascadeType.PERSIST, CascadeType.MERGE})
private Set<Book> books = new HashSet<Book>();
在Book.java
@ManyToMany
@Cascade({org.hibernate.annotations.CascadeType.PERSIST})
@JoinTable(
name="BookAuthor",
joinColumns={@JoinColumn(name="bookId", referencedColumnName="id")},
inverseJoinColumns={@JoinColumn(name="authorId", referencedColumnName="id")}
)
private Set<Author> authors = new HashSet<Author>();
有一個映射表BOOKAUTHOR在數據庫。
這就是我正在做的。
- 設置FlushMode到手動
- 從數據庫
- 創建一個新的作者得到一本書。 (瞬態)
- 將作者添加到作者在Book實例中設置。
- 開始交易
- 更新賬戶實例
- 提交交易。
出乎我的意料,我注意到,在更新書有不傳播和持續瞬態者實例。作者實例仍然是暫時的。
現在,如果將FlushMode設置爲AUTO(默認值),則不僅暫時作者已提交,而且還在BookAuthor表中創建一個關係。
我很驚訝地發現flush()具有如此重要的作用。
我做錯了什麼?
Regards,
Shardul。
OH,我的印象是,當我提交事務時,更改被寫入數據庫。順便說一句,當我不使用Hibernate時flush()的等價物是什麼? – 2012-01-29 12:20:59
但是,當我將FlushMode設置爲手動並簡單地保存/保留一個簡單的對象時,即使我不刷新也可以正常工作。它在這種情況下如何工作? – 2012-01-29 12:25:37
參見http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#objectstate-flushing。它可能寫入數據庫,因爲您使用的是本地ID生成。JPA中flush的同義詞是... flush。請參閱http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#flush%28%29。純JDBC中沒有等價物,因爲JDBC沒有持久對象在內存會話高速緩存中的概念。 – 2012-01-29 12:43:19