詳細描述Hibernate3實踐
在向大家詳細介紹Hibernate3實踐之前,首先讓大家了解下Session的save()、persist()、update()、saveOrUpdate()、merge()、delete()方法。
Hibernate3實踐
Hibernate不是盞省油的燈,也不是想像的射來射去很簡單的事。有很多細節(jié)處理不好會讓你很不舒服的,這方面最突出的表現(xiàn)在兩方面:一是事務(wù)管理,是JTA事務(wù)還是 JDBC事務(wù)?幸虧有了Spring和J2EE容器;二是胡亂映射,模型關(guān)系建立不合理或者錯誤導(dǎo)致,或者是映射策略和技術(shù)不過關(guān)導(dǎo)致。這樣的最終結(jié)果是拋出一堆HibernateException,摸不著頭腦。下面是我實踐中的一些總結(jié)作為備忘錄寫出來。
參考的是***的Hibernate 3.2.6GA API文檔,還吸收了Hibernate牛人(夏新)寫的書和翻譯中文開發(fā)手冊的精華。
1、Configuration/SessionFactory/Session
Configuration實例代表了一個應(yīng)用程序中Java類型 到SQL數(shù)據(jù)庫映射的完整集合. Configuration被用來構(gòu)建一個(不可變的 (immutable))SessionFactory.
◆SessionFactory是線程安全的,創(chuàng)建代價很高。
◆Session是非線程安全的,輕量級的。一個Session對應(yīng)一個JDBC連接,
◆Session的connection()會獲取Session與之對應(yīng)的數(shù)據(jù)庫連接Connection對象。
◆Session的功能就是操作對象的,這些對象和數(shù)據(jù)庫表有映射關(guān)系。
◆Session操作的對象是有狀態(tài)的,分三類:
1)自由狀態(tài)(transient): 未持久化,未與任何Session相關(guān)聯(lián),數(shù)據(jù)庫表中沒有對應(yīng)的記錄。
2)持久化狀態(tài)(persistent): 與一個Session相關(guān)聯(lián),對應(yīng)數(shù)據(jù)庫表中一條記錄。
3)游離狀態(tài)(detached): 已經(jīng)進行過持久化,但當前未與任何Session相關(guān)聯(lián),數(shù)據(jù)庫表中曾經(jīng)有一條記錄,現(xiàn)在還有沒有就不知道了。
游離狀態(tài)的實例可以通過調(diào)用save()、persist()或者saveOrUpdate()方法進行持久化。持久化實例可以通過調(diào)用 delete()變成游離狀態(tài)。通過get()或load()方法得到的實例都是持久化狀態(tài)的。游離狀態(tài)的實例可以通過調(diào)用 update()、0saveOrUpdate()、lock()或者replicate()進行持久化。游離或者自由狀態(tài)下的實例可以通過調(diào)用 merge()方法成為一個新的持久化實例。
2、Session的save()/persist()/update()/saveOrUpdate()/merge()/delete()方法
◆save()方法將指定對象保存,插入表中一條數(shù)據(jù);
◆persist()方法將指定對象保存,插入表中一條數(shù)據(jù),我還沒發(fā)現(xiàn)它和save方法有什么特別之處。
◆replicate()方法完全使用給定對象各個屬性的值(包括標識id)來持久化給定的游離狀態(tài)(Transient)的實體,很暴力啊,其中還需要指定存儲模式(有四種保存策略供選擇)。
◆update()方法將指定對象更新,更新表中一條數(shù)據(jù);
◆saveOrUpdate()方法接收一個實體對象,根據(jù)實體對象的id判斷是否已經(jīng)存在進行保存或更新操作,這樣保存和更新方法就統(tǒng)一了;
◆merge()方法將給定的對象的狀態(tài)復(fù)制到具有相同標識的持久化對象上。
◆delete()方法將指定對象刪除,刪除表中一條數(shù)據(jù);
特別注意:為了使用saveOrUpdate()方法,在由定義映射文件時,通過設(shè)定<id>標簽的unsaved- value="null"來判斷執(zhí)行什么操作:當id屬性等于unsaved-value的值(在此為null)時,則認為還沒有保存,應(yīng)該執(zhí)行保存操作,否則執(zhí)行更新操作。這樣設(shè)定之后,可以使用 saveOrUpdate()方法來統(tǒng)一保存和更新的方法。以上是Hibernate3實踐
【編輯推薦】