2012-01-29 81 views
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在數據庫。

這就是我正在做的。

  1. 設置FlushMode到手動
  2. 從數據庫
  3. 創建一個新的作者得到一本書。 (瞬態)
  4. 將作者添加到作者在Book實例中設置。
  5. 開始交易
  6. 更新賬戶實例
  7. 提交交易。

出乎我的意料,我注意到,在更新書有傳播和持續瞬態者實例。作者實例仍然是暫時的。

現在,如果將FlushMode設置爲AUTO(默認值),則不僅暫時作者已提交,而且還在BookAuthor表中創建一個關係。

我很驚訝地發現flush()具有如此重要的作用。

我做錯了什麼?

Regards,

Shardul。

回答

0

flush是將更改寫入數據庫的方法。沒有沖洗,沒有寫。很顯然,如果將flush模式設置爲手動模式並且從不調用flush,則不會將任何內容寫入數據庫。

+0

OH,我的印象是,當我提交事務時,更改被寫入數據庫。順便說一句,當我不使用Hibernate時flush()的等價物是什麼? – 2012-01-29 12:20:59

+0

但是,當我將FlushMode設置爲手動並簡單地保存/保留一個簡單的對象時,即使我不刷新也可以正常工作。它在這種情況下如何工作? – 2012-01-29 12:25:37

+1

參見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