2015/5/11

關於hibernate查詢--



來源:
http://www.cnblogs.com/balaamwe/archive/2012/03/13/2393912.html
http://shilinfeng.cool.blog.163.com/blog/static/1183214652013528113441283/

起因:
使用hibernate查詢一個TABLE,此table的資料,由另外一組hibernate來負責
剛啟動時正常,但是一段時間之後,就一直停留在固定一筆欄位
一開始推測:browser自己建立cache,所以要強制F5
後來還是一樣狀況
開始追查,推測是hibernate取出資料有錯
查詢到部分網頁,可解決方式有二:
A.每次重新取得一個session
B.使用flush

摘錄如下:

A.
問題描述:這個最開始查詢時是讀取數據庫的,但是在頁面如果對數據進行刪改後,再來查詢就會出現結果錯誤!
原因:查出的數據會放入到緩存中,而我插入和刪除數據用的是存儲過程做的,因為存儲過程會直接將數據插入到數據庫中而不會放入到緩存中,所以當再次查詢數據時由於是獲取的當前的session,就會默認從緩存中查找數據,就導致了查出的數據會和數據庫的數據不對應!
結局辦法就是重新打開一個session,就正常了!

HibernateUtil.getSessionFactory().openSession();

 B.
Hibernate會儘量將與數據庫的操作延遲,直到必須要與數據庫進行交互,例如save方法一般會在提交時才真正執行,最終在提交時會以批處理的方式與數據庫進行交互,以提高效率。
而將操作延遲,就是利用緩存,將最後要處理的操作放到緩存中。
通過設置session.setFlushMode(),可以精確控制Hibernate的FlushMode.
(1) FlushMode.AUTO:Hibernate判斷對象屬性有沒有改變,如果被更改成為髒數據,則在一個查詢語句前將更新此改動以保證數據庫的同步。這也是Hibernate的默認清理模式。
(2) FlushMode.COMMIT:在事務結束之前清理session的緩存。這樣有可能導致查出髒數據
(3) FlushMode.NEVER:除非強制調用Session.flush(),否則永遠不清理Session。相當於將數據庫設置為一個只讀的數據庫。
       【如果此時進行數據的寫入操作,會發生錯誤】
(4) FlushMode.ALWAYS:在每一個查詢數據之前都調用Session.flush()。很顯然這種效率很低。 

筆記下來,以後好查詢


沒有留言:

JPA+complex key+custom Query

  來源: https://www.cnblogs.com/520playboy/p/6512592.html   整個來說,就是有複合主鍵 然後要使用  public interface XxXXxx DAO extends CrudRepository<Tc...