JpaDaoSupport的用法是怎麼樣的?

使用JpaDaoSupport需要什麼jar包,JpaDaoSupport和jdbcDaoSupport的用法有什麼區別


開源技術一旦涉及整合,就會互相影響,Spring 和 Hibernate 是個典型。

鑒於 hibernate 實現了 JPA 規範,就不再贅述 JpaDaoSupport、JpaTemplate

下面以 HibernateDaoSupport、HibernateTemplate 為例同時解釋。

Spring 提供 HibernateDaoSupport、HibernateTemplate 的初衷是:

  • 提供 common dao operation method (通用數據操作方法),方便快速開發
    • 你的 dao 可以 extends xxxDaoSupport 獲取繼承來的便利方法
    • 你的 dao 可以 autowire xxxTemplate 獲取注入來的便利方法
    • 以上兩種方式本質是相同的
  • 管理 hibernate 的 session
    • hibernate 3.0.1 之前,並沒有提供會話管理方案,所以
      • Spring 不得已在 HibernateDaoSupport、HibernateTemplate 中提供了支持
      • 通過 HibernateDaoSupport、HibernateTemplate 獲取到的 session,可以無縫綁定 spring 管理的事務
  • 對持久層異常自動轉化
    • 雖然 hibernate 將底層異常封裝為 HibernateException 實現了大一統,但 Spring 顯然是更希望將任何持久層異常(不單單限定於 HibernateException)封裝為自己的 DataAccessException 實現大一統

但是,以上,在 hibernate 3.0.1 出現後,都成了歷史。

不負眾望,hibernate 在 3.0.1 後實現了會話管理(contextual session),對應地,Spring 在 HibernateDaoSupport、HibernateTemplate 的 javadoc 中也做了如下更新:

Spring Reference 中也聲明如下:

總結一下,如果使用的是 Hibernate 3.0.1+,現在 Spring 推薦這麼做:

  • Dao 不要再繼承 HibernateDaoSupport 或注入 HibernateTemplate,這兩個類都已不推薦使用
  • Dao 應該直接注入 Hibernate 的 SessionFactory

這麼做的好處是:

  • Dao 層代碼僅依賴於 hibernate api, 但不依賴於 spring api,這樣更合理,畢竟 hibernate 才是持久層功能的提供者
  • Dao 內可以通過 SessionFactory.getCurrentSession() 來進行純 hibernate 操作,獲取到的 Session 也是受管理的(managed),至於管理方案,可以通過如下方式進行配置
    • 先配置 hibernate ,然後整合到 spring 配置里

hibernate.cfg.xml

&

&

&
&
&

name="current_session_context_class"&>thread&

&

&

applicationContext.xml

&
&

name="configLocation"&>
&classpath:hibernate.cfg.xml&
& &

    • 直接配置 Spring 提供的 LocalSessionFactoryBean

&
&

name="hibernateProperties" &>
&


&

key="hibernate.show_sql"&>true& &

key="hibernate.current_session_context_class"&>thread& & & &

回到正題,說下題主的問題

  • 使用 JpaDaoSupport 需要什麼jar包?

開源技術的整合,依賴問題比較嚴重,建議使用 maven 進行管理,參考依賴如下:

&
&
&org.hibernate&
&hibernate-entitymanager&
&${hibernate.version}&
&

&
&
&org.springframework&
&spring-orm&
&${spring.version}&
&

  • JpaDaoSupport 和 jdbcDaoSupport 的用法有什麼區別
    • 使用方式
      • Spring 提供的 xxxDaoSupport 都是需要繼承來使用的
      • Spring 提供的 xxxTemplate 都是需要注入來使用的
      • xxxDaoSupport、xxxTemplate 本質相同,建議看 xxxDaoSupport 源碼

      • 一般來說,組合(注入)優先於繼承,即便要用,注入使用比較好
    • 使用區別
      • JpaDaoSupport 基於 JPA,jdbcDaoSupport 基於 JDBC,用法沒有可比性。

書籍推薦

  • JPA
    • 參考書:《Java Persistence with JPA - Daoqi Yang》
    • 搭配 Hibernate Manual 做參照

  • JDBC + Spring
    • 參考書:《Just.Spring.Data.Access - Madhusudhan.Konda》
    • 搭配 Spring Reference - 18. Data access with JDBC

以上,暫時這麼多,想到再補充。參考資料:

  • Spring Reference - 13.3.2 Implementing DAOs based on plain Hibernate 3 API
  • Hibernate Manual - 2.5 Contexual Session

    我的其他回答:

  • spring有什麼缺點嗎? - Night Silent 的回答

  • 哪些企業或項目在用Spring boot,或者它會在多大程度上替代Spring? - Night Silent 的回答

  • 會計轉行從事IT,如何在一年時間內全職學習? - Night Silent 的回答

  • SpringDataJPA持久層問題? - Night Silent 的回答

  • spring4+hibernate4 事務管理 非常難受的問題 ? - Night Silent 的回答

  • spring 中為何存在import註解,同一個包中的類直接使用就行了 用import註解感覺有點怪? - Night Silent 的回答

  • 更多回答,請關注我,獲取最新動態

  • 如果此回答幫到了你,一個小小的贊,一次分享,都會讓更多人受益

  • 此外,有興趣的話,歡迎加入我的 Java EE 自學群

  • 一號群:151280557(即將滿額):二維碼頁面 (二維碼自動識別)

  • 二號群:521909033(新群,限時免費加入): 二維碼頁面 (二維碼自動識別)

  • 如果覺得我的回答對你很有幫助,可以考慮微信打賞:

關於群的說明:

  • 長期以來,我創建的自學群飽受各種培訓機構、群宣水軍、拿來主義者侵擾,為保持本群的技術氛圍,本群入群方式修改為付費入群

  • 已經在群內的各位成員,請珍惜這個平台,一旦違反群規總是討論和 Java 無關話題的,將被清理出群,再次進群,你只能付費,不守規矩是有代價的

  • 新入群的朋友,請先查閱群公告,了解下群規,入群後,歡迎有準備的提問,拒絕拿來主義

  • 入群所需費用,會被充當群費

  • 如果有朋友覺得本群/本篇文章幫到了你,也可以聯繫我(Q或知乎私信),為本群捐贈群費,我會在公告里向大家公示數額及用途

  • 群費用途:為大家合購教程、為群續費、由我牽頭做一些特定的事情(投票決定)等等

  • 再次重申:培訓機構、群宣水軍、拿來主義者,請自覺遠離


推薦閱讀:

struts2和springmvc區別?

TAG:Struts2 | Spring | JavaEE | JavaWeb | Hibernate3 |