天天看點

傳智播客---Spring 整合 Hibernate 與 Spring 整合 Struts1.x

Spring 整合 Hibernate 與 Spring 整合 Struts1.x 今天佟老師給我們講3個架構的內建,一共有3種內建方法。每一種都有自己的優點也有缺點!在用時自己喜歡喜歡用就選擇哪一種! 1.Spring 整合 Hibernate Spring 支援大多數流行的 ORM 架構, 包括 Hibernate JDO, TopLink, Ibatis 和 JPA。 Spring 對這些 ORM 架構的支援是一緻的, 是以可以把和 Hibernate 整合技術應用到其他 ORM 架構上. Spring 2.0 同時支援 Hibernate 2.x 和 3.x. 但 Spring 2.5 隻支援 Hibernate 3.1 或更高版本 2.在 Spring 中配置 SessionFactory 對于 Hibernate 而言, 必須從原生的 Hibernate API 中建構 SessionFactory. 此外, 應用程式也無法利用 Spring 提供的資料存儲機制(例如: Spring 的事務管理機制) Spring 提供了對應的工廠 Bean, 可以用單執行個體的形式在 IOC 容器中建立 SessionFactory 執行個體. 3.在 Spring 中配置 SessionFactory(1) 可以利用 LocalSessionFactoryBean 工廠 Bean, 聲明一個使用 XML 映射檔案的 SessionFactory 執行個體. 需要為該工廠 Bean 指定 configLocation 屬性來加載 Hibernate 配置檔案. 如果在 Spring IOC 容器中配置資料源. 可以将該資料源注入到 LocalSessionFactoryBean 的 dataSource 屬性中. 該屬性可以指定的資料源會覆寫掉 Hibernate 配置檔案裡的資料庫配置. 可以将所有配置合并到 LocalSessionFactoryBean 中,進而忽略 Hibernate 配置檔案. 可以在 LocalSessionFactoryBean 的 mappingResources 屬性中指定 XML 映射檔案的位置.該屬性為 String[] 類型. 是以可以指定一組映射檔案. 在 hibernateProperties 屬性中指定資料庫方言等. 4.用 Spring 的 ORM 模闆持久化對象 在單獨使用 ORM 架構時, 必須為每個 DAO 操作重複某些正常任務. 例如: 打開關閉 Session 對象; 啟動, 送出, 復原事務等. 同 JDBC 一樣, Spring 采取了相同的方法 ------ 定義模闆類和 DAO 支援類來簡化 ORM 架構的使用. 而且 Spring 在不同的事務管理 API 之上定義了一個事務抽象層. 對于不同的 ORM 架構, 隻需要選擇相應的事務管理器實作. 5.Spring 對不同資料存儲政策的支援類 HibernateTemplate 確定了 Hibernate 會話能夠正确地打開和關閉. HibernateTemplate 也會讓原生的 Hibernate 事務參與到 Spring 的事務管理體系中來. 進而利用 Spring 的聲明式事務管理事務. 6.使用 Hibernate 模闆 HibernateTemplate 中的模闆方法管理會話和事務. 如果在一個支援事務的 DAO 方法中有多個 Hibernate 操作, 模闆方法可以確定它們會在同一個會話和事務中運作. 是以沒有必要為了會話和事務管理去和 Hibernate API 打交道. 通過為 DAO 方法添加 @Transactional 注解将其聲明為受事務管理的. HibernateTemplate 類是線程安全的, 是以可以在 Bean 配置檔案中隻聲明一個執行個體, 并将該執行個體注入到所有的 Hibernate DAO 中. 7.繼承 Hibernate 的 DAO 支援類 Hibernate DAO 可以通過繼承 HibernateDaoSupport 來繼承 setSessionFactory() 和 setHibernateTemplate() 方法. 然後, 隻要在 DAO 方法中調用 getHibernateTemplate() 方法就可以擷取到模闆執行個體. 如果為 HibernateDaoSupport 實作類注入了 SessionFactory 執行個體, 就不需要在為之注入 HibernateTemplate 執行個體了, 因為HibernateDaoSupport 會根據傳入的 SessionFactory 在其構造器内建立 HibernateTemplate 的執行個體, 并賦給 hibernateTemplate 屬性 8.用 Hibernate 的上下文 Session 持久化對象 Spring 的 HibernateTemplate 可以管理會話和事務, 簡化 DAO 實作. 但使用 HibernateTemplate 意味着DAO 必須依賴于 Spring 的 API 代替 HibernateTemplate 的另一種辦法是使用 Hibernate 的上下文 Session 對象. Hibernate 上下文 Session 對象和 Spring 的事務管理合作的很好, 但此時需保證所有的DAO 方法都支援事務注意此時不需在 beans.xml 檔案中配置, 因為 Spring 此時已經開始事務, 是以已經在 ThreadLocal 對象中綁定了 Session 對象 9.用 Hibernate 的上下文 Session 持久化對象(2) 在 Hibernate 會話中調用原生的方法時, 抛出的異常依舊是原生的 HibernateException. 為了保持一緻的異常處理方法, 即把 Hibernate 異常轉換為 Spring 的 DataAccessException 異常, 那麼必須為需要異常轉換的 DAO 類添加 @Respository 注解. 然後在注冊一個 執行個體, 将原生的 Hibernate 異常轉換為 Spring 的 DataAccessException 層次結構中的資料存取異常. 這個 Bean 後置處理器隻為添加了@Respository 注解的 Bean 轉換異常. 從 Hibernate 3 開始, SessionFactory 新增加了 getCurrentSession() 方法, 該方法可直接擷取“上下文“相關的 Session. Hibernate 通過 CurrentSessionContext 接口的實作類和 配置參數hibernate.current_session_context_class定義 “上下文” JTASessionContext: 根據 JTA 來跟蹤和界定 Session 對象. ThreadLocalSessionContext: 通過目前正在執行的線程來跟蹤和界定 Session 對象 ManagedSessionContext: 通過正在目前執行來跟蹤和界定 Session 對象. 但程式需要調用該類的靜态方法來綁定 Sessio 對象, 取消綁定, flush 或者關閉 Session 對象. 10.Hibernate 上下文相關的 Session(3) 如果使用 ThreadLocalSessionContext 政策, Hibernate 的 Session 會随着 getCurrentSession() 方法自動打開, 随着事務送出自動關閉. 若目前應用是基于 JTA 的分布式事務, 通常采用第一種方式; 而對于獨立的 Hibernate 應用則使用第二種應用. Spring 整合 Struts1.x 11.在通用的 web 應用中通路 Spring 通過注冊 Servlet 監聽器 ContextLoaderListener, Web 應用程式可以加載 Spring 的ApplicationContext 對象. 這個監聽器會将加載好的ApplicationContext 對象儲存到 Web 應用程式的 ServletContext 中. 随後, Servlet 或可以通路 ServletContext 的任意對象就能通過一個輔助方法來通路 Spring 的應用程式上下文了 12.在通用的 web 應用中通路 Spring 具體實作 在 web.xml 檔案中注冊 Spring 提供的 Servlet 監聽器 , 它會在目前 web 應用被加載時将 Spring 的 ApplicationContext 儲存到 ServletContext 對象中. 監聽器通過查找 web 應用初始化參數 contextConfigLocation 來擷取 Bean 配置檔案的位置. 如果有多個 Bean 配置檔案, 可以通過逗号或空格進行分隔. contextConfigLocation 的預設值為 /WEB-INF/applicationContext.xml. 若實際的檔案和預設值一緻則可以省略這個 web 應用的初始化參數

繼續閱讀