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