Hibernate配置要點詳談

來源:互聯網
上載者:User
     1.兩種設定檔: 
    A.hibernate.cfg.xml和B.hibernate.properties     
    A中可含對應檔的配置,而B中hard codes加對應檔。 
    A.Configuration config=new Configuration().config(); 
    B. Configuration config=new Configuration(); 
    config.addClass(TUser.class); 

    2.你不必一定用hibernate.cfg.xml或hibernate.properties這兩檔案名稱,你也不一定非得把設定檔放在 Classes下,  File file=new File("c://sample//myhibernate.xml");  Configuration config=new Configuration().config(file); 

    3. session.Flush() 強制資料庫立即同步,當用事務時,不必用flush,事務提交自動調用flush在session關閉時也會調用flush 

    4. Hibernate總是使用物件類型作為欄位類型 

    5. XDoclet專門建立了hibernate doclet,就是在java代碼上加上一些java docTag,後來再讓XDoclet分析該java代碼,產生對應檔; 

    6.HQL子句本身大小寫無關,但是其中出現的類名和屬性名稱必須注意大小寫區分。 

    7.關係:Constrained : 約束,表明主控表的主鍵上是否存在一個外鍵(foreigh key)對其進行約束。 

    property-ref:關聯類別中用於與主控類相關聯的屬性名稱,預設為關聯類別的主鍵屬性名稱 

    單向一對多需在一方配置,雙向一對多需在雙方進行配置 

    8.lazy=false:被動方的記錄由hibernate負責記取,之後存放在主控方指定的Collection類型屬性中 

    9. java.util.Set或net.sof.hibernate.collecton.Bag類型的Collection 

    10.重要:inverse:用於標識雙向關聯中的被動方一端。 

    inverse=false的一方(主控方)負責維護關聯關係.預設值:false 

    11.batch-size:採用消極式載入特徵時,一次讀入的資料數昨。 

    12.一對多通過主控方更新(主控方為一方時) 

user.getAddresses().add(addr);
session.save(user);//通過主控對象串聯更新

    13.在one-to-many 關係中,將many 一方設為主動方(inverse=false)將有助效能的改善。在一方設定關係時,inverse=true,即將主控權交給多方,  這樣多方可主動 從一方獲得foreign key,然後一次insert即可完工。

addr.setUser(user);//設定關聯的TUser對象  user.getAddresses().add(addr);
session.save(user);//串聯更新

    14.只有設為主控方的一方才關心(訪問)對方的屬性,被動方是不關心對方的屬性的。 

    15.one-to-many與many-to-one節點的配置屬性不同: 

    一對多關聯性多了lazy和inverse兩個屬性多對多節點屬性: 
    column:中間映射表中,關聯目標表的關聯欄位 
    class:類名,關聯目標類 
    outer-join:是否使用外聯結 
    注意:access是設定屬性值的讀取方式。 
    column是設定關聯欄位。 

    16.多對多,注意兩方都要設定inverse和lazy,cascade只能設為insert-update 

    多對多關係中,由於關聯關係是兩張表相互引用,因此在儲存關係狀態時必須對雙方同時儲存。
    group1.getRoles().add(role1);  role1.getGroups().add(group1); 
    session.save(role1);  session.save(group1); 

    17.關於vo和po  vo經過hibernate容量處理,就變成了po(該vo的引用將被容器儲存,並且在session關閉時flush,因此 po如果再傳到其它地方改變了,就危險了)    vo和po相互轉換:BeanUtils.copyProperties(anotherUser,user); 

    18.對於save操作而言,如果對象已經與Session相關聯(即已經被加入Session的實體容器中),則無需進行具體的操作。因為之後的 Session.flush過程中,Hibernate 會對此實體容器中的對象進行遍曆,尋找出發生變化的實體,產生並執行相應的update 語句。 

    19.如果我們採用了消極式載入機制,但希望在一些情況下,實現非延遲加 載時的功能,也就是說,我們希望在Session關閉後,依然允許操作user的addresses 屬性 Hibernate.initialize方法可以通過強制載入關聯對象實現這一功能: 這也正是我們為什麼在編寫POJO時,必須用JDK Collection介面(如Set,Map), 而非特定的JDK Collection實作類別(如HashSet、HashMap)申明Collection屬性的 原因。 

    20.事務:從sessionFactory獲得session,其自動認可屬性就已經關閉(AutoCommit=false),此時若執行了jdbc操作,如果不顯式調用session.BeginTransaction(),是不會執行事務操作的。 
    jdbc transaction:基於同一個session(就是同一個connection)的事務; 
    jta transaction:跨session(跨connection)事務. 
    對於jta事務,有三種實現方法: 
    A。UserTransaction tx=new InitialContext().lookup("..."); 
    tx.commit(); 
    B. 使用hibernate封裝的方法:(不推薦) 
    Transaction tx=session.beginTransaction(); 
    tx.commit(); 
    C. 使用ejb之sessionBean的事務技持方法,你只要在把需要在發布描述符中,把需要jta事務的方法聲明為require即可 

    21.悲觀鎖,樂觀鎖:  樂觀鎖一般通過version來實現,注意version節點必須出現在id後。 

    22.Hibernate中,可以通過Criteria.setFirstResult和Criteria.setFetchSize方法設定分頁範圍。 
    Query介面中也提供了與其一致的方法,hibernate主要在dialect類中實現在這個功能。 

    23.cache 
    …… 
    net.sf.ehcache.hibernate.Provider  
    還需對ecache本身進配置 
    之後在對應檔中指定各個映射實體的cache策略 
    .... 
    ***************************************************** Query.list()跟Query.iterate()的不同: 對於query.list()總是通過一條sql語句擷取所有記錄,然後將其讀出,填入pojo返回; 但是query.iterate(),則是首先通過一條Select SQL 擷取所有符合查詢條件的記錄的 id,再對這個id 集合進行迴圈操作,通過單獨的Select SQL 取出每個id 所對應的記 錄,之後填入POJO中返回。 

    也就是說,對於list 操作,需要一條SQL 完成。而對於iterate 操作,需要n+1 條SQL。,list方法將不會從Cache中讀取資料。iterator卻會。 

    24.ThreadLocal:它會為每個線程維護一個私人的變數空間。實際上, 其實現原理是在JVM 中維護一個Map,這個Map的key 就是當前的線程對象,而value則是 線程通過ThreadLocal.set方法儲存的對象執行個體。當線程調用ThreadLocal.get方法時, ThreadLocal會根據當前線程對象的引用,取出Map中對應的對象返回。 

    這樣,ThreadLocal通過以各個線程對象的引用作為區分,從而將不同線程的變數隔離開來。 

    25.Hibernate官方開發手冊標準樣本:

public class HibernateUtil ...{ private static SessionFactory sessionFactory;
static ...{ try ...{
// Create the SessionFactory sessionFactory =
new Configuration().configure().buildSessionFactory(); } catch (HibernateException ex) ...{
throw new RuntimeException( "Configuration problem: " + ex.getMessage(), ex );
} } public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() throws HibernateException ...{
Session s = (Session) session.get();
// Open a new Session, if this Thread has none yet if (s == null) {
s = sessionFactory.openSession(); session.set(s);
} return s;
} public static void closeSession() throws HibernateException ...{
Session s = (Session) session.get();
session.set(null);
if (s != null) s.close();
} }

    26.通過filter實現session的重用:

public class PersistenceFilter implements Filter ...{ 
protected static ThreadLocal hibernateHolder = new ThreadLocal();
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException ...{ hibernateHolder.set(getSession());
try ...{ …… chain.doFilter(request, response);
…… } finally ...{ Session sess = (Session)hibernateHolder.get();
if (sess != null) ...{ hibernateHolder.set(null);
try ...{ sess.close(); } catch (HibernateException ex) ...{
throw new ServletException(ex);
} } } } ……}

    27.Spring的參數化交易管理功能相當強大,筆者建議在基於Spring Framework的應用 開發中,盡量使用容器管理事務,以獲得資料邏輯代碼的最佳可讀性。

public class UserDAO extends HibernateDaoSupport implements IUserDAO ...{ 
public void insertUser(User user) ...{ getHibernateTemplate().saveOrUpdate(user);
} }

    上面的UserDAO實現了自訂的IUserDAO介面,並擴充了抽象類別: 
    HibernateDaoSupport HibernateSupport實現了HibernateTemplate和SessionFactory執行個體的關聯。 
    HibernateTemplate對Hibernate Session操作進行了封裝,而 HibernateTemplate.execute方法則是一封裝機制的核心 
    *在spring的設定檔裡,移植了整個hibernate.cfg.xml的內容。

註:以上內容來自網路,本人不承擔連帶責任。
文章轉自:http://tech.it168.com/j/d/2006-11-05/200611051306869.shtml

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.