Hibernate提高性能的几点建议
生活随笔
收集整理的這篇文章主要介紹了
Hibernate提高性能的几点建议
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Hibernate提高性能的幾點建議 1.盡量少用one-to-many的映射,如果用最好把lazy設(shè)置成true,這樣在查詢主表時其關(guān)聯(lián)子表就不會被查詢,從而節(jié)約數(shù)據(jù)庫的資源。 2. 當(dāng)lazy設(shè)置為true時,如果需要(用Criteria或者DetachedCriteria)查詢子表對象,則會拋出一個session closed的異常,因為Hibernate在主表查詢完成后,hibernate對象的session就被關(guān)閉了,也就相當(dāng)于JDBC中的Connection被干掉了,沒有connection(Hibernate為Session對象)的查詢是非法操作,同樣的這里也將報異常信息。那么,我們要怎么進行處理呢?如果想要查詢子表對象,就要在作one-to-many的設(shè)置時將屬性fetch設(shè)置為join值,這時,只要查詢時就去抓取子對象,這也是hibernate的一種抓取策略。 3.如果lazy="true"并且fetch="join"時,用QBC進行分頁查詢,會帶來新的問題,fetch="join"是采用左外連接查詢的,所以主表的數(shù)據(jù)就會出現(xiàn)很多重復(fù)記錄,這時需在QBC條件對象加上一個去重的限制,具體代碼為: criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
當(dāng)然添加實體之間的關(guān)聯(lián)之后,會把B也加載出來,就算設(shè)置了延遲加載也沒用。
也就是說fetch是為子對象服務(wù)的,不適合主對象的查詢操作.
4. 對于第3點的描述,如果用HQL查詢則一切正常,不用加去重操作,子對象也可以查詢出來. 5. 如果lazy="false"時,沒有設(shè)置fetch屬性,那么在進行HQL查詢時也會拋出sessin 被關(guān)閉的異常,所以需要在HQL寫上抓取子對象的關(guān)鍵字,例如:from main join?fetch?main.detail as detail,程序員如果做了該操作,在獲取子對象屬性時就能采取抓取策略. 6. 在使用DetachedCriteria拼湊查詢條件的時候,如何條件涉及到子對象的屬性時,需要用DetachedCriteria.createAlias("b","b")來建立映射關(guān)系,否則將報出could not resolve property 的Hibernate查詢異常eg:實體A中包含set<B>
那么在DetachedCriteria 中拼湊查詢條件時,如果條件是B中的某個屬性Bp1的話,那么應(yīng)該通過createAlias()創(chuàng)建 實體A于B的關(guān)聯(lián),例:criteria.createAlias("B", "B"),那么你在添加B的查詢條件的時候,add(Restrictions.eq("B.Bp1","test")); 時才不會報錯,不然會報找不到屬性B.Bp1,當(dāng)然在設(shè)置了關(guān)聯(lián)之后還會引發(fā)一個問題也就是上面提到的重復(fù)問題,因為設(shè)置關(guān)聯(lián)之后hibernate是使用左外連接拼接的sql,這里的解決方案就是也需要加上上面提到的去除重復(fù)數(shù)據(jù)的代碼即可.當(dāng)然添加實體之間的關(guān)聯(lián)之后,會把B也加載出來,就算設(shè)置了延遲加載也沒用。
轉(zhuǎn)載于:https://www.cnblogs.com/zengsong-restService/archive/2013/02/27/2934635.html
總結(jié)
以上是生活随笔為你收集整理的Hibernate提高性能的几点建议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Quartus和ISErom文件格式
- 下一篇: CentOS6.2下使用Nokia E7