《Spring實戰》-第十一章:利用對象-關係映射持久化數據

慢慢來比較快,虛心學技術

原文鏈接:《Spring實戰》-第十一章:利用對象-關係映射持久化數據

一、什麼是對象-關係映射(ORM)/爲什麼需要對象-關係映射

先來了解幾個概念:

  • 瞬時狀態:在程序運行的時候,有些數據保存在內存中,當程序退出後,這些數據就不復存在了,稱這些數據的狀態是瞬時的。
  • 持久狀態:數據以文件形式保存在輔存中,這樣,程序退出後,數據依然存在,這種狀態稱之爲持久的。
  • 持久化 :即在程序中的瞬時狀態和持久狀態之間轉換的機制。

實際上,我們通常所說的持久化,一般指的持久化數據到數據庫中。

在數據持久化的世界裏面,傳統的dao已經很難滿足開發的需求,或者顯得過於臃腫耦合,程序代碼中存在大量的問號字符串(SQL語句)。那麼,使用對象-關係映射將對象屬性映射到數據庫表的列字段,從而實現操作對象以操作數據記錄,簡化代碼就很有必要了,同時我們還需要學習用到幾個特性:

  • 延遲加載( Lazy loading ):隨着我們的對象關係變得越來越複雜,有時候我們並不希望立即獲取完整的對象間關係。舉一個典型的例子,假設我們在查詢一組 PurchaseOrder 對象,而每個對象中都包含一個 LineItem 對象集合。如果我們只關心 PurchaseOrder 的屬性,那查詢出 LineItem 的數據就毫無意義。而且這可能是開銷很大的操作。延遲加載允許我們只在需要的時候獲取數據。
  • 預先抓取( Eager fetching ):這與延遲加載是相對的。藉助於預先抓取,我們可以使用一個查詢獲取完整的關聯對象。如果我們需要 PurchaseOrder 及其關聯的 LineItem 對象,預先抓取的功能可以在一個操作中將它們全部從數據庫中取出來,節省了多次查詢的成本。
  • 級聯( Cascading ):有時,更改數據庫中的表會同時修改其他表。回到我們訂購單的例子中,當刪除 Order 對象時,我們希望同時在數據庫中刪除關聯的 LineItem 。

一些可用框架提供了上述服務,這些服務的通用名稱是對象 / 關係映射( object-relational mapping , ORM )。在持久層使用 ORM 工具,可

以節省數千行的代碼和大量的開發時間。 ORM 工具能夠把你的注意力從容易出錯的 SQL 代碼轉向如何實現應用程序的真正需求。

二、Spring對ORM框架的支持與擴展

Spring對多個持久化框架的集成提供了支持,這些框架包括
Hibernate:可能是最常用的ORM框架,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。

iBATIS:Apache推出的一種輕量級的對象關係映射(ORM)框架

Java數據對象( Java Data Objects , JDO ): 是一個應用程序接口(API),它是Java程序員能夠間接地訪問數據庫,也就是說,不需使用直接的結構化查詢語言(SQL)語句。JDO是作爲Java數據庫連接(JDBC)的一個補充來介紹的,而JDBC是一個支持使用SOL語句對流行的數據庫程序進行訪問的接口。有了 JDO,程序員就可以使用類來定義數據對象,然後支撐程序就會根據類的定義來管理對給定數據庫的實際的數據訪問了。

Java持久化 API ( Java Persistence API , JPA ):JAVA 持久化API,是EJB 3.0 的專家推出,作爲 JSR-220的一部分,簡單點來說可以理解爲是一個JAVA的標準規範,這個規範爲對JAVA對象的持久化制定了一些標準的接口,也可以說,JPA****是一個標準的ORM(對象關係映射)規範,提出這個規範,一方面是爲了簡化EJB中對於對象持久化的操作,另一方面,也希望通過制定統一規範,達到一統ORM標準的目的

除了對這些框架提供集成支持,Spring還提供了額外的擴展增強服務:

  • 支持集成 Spring 聲明式事務;
  • 透明的異常處理;
  • 線程安全的、輕量級的模板類;
  • DAO 支持類;
  • 資源管理

三、JPA框架分析

簡單來說,JPA只是一套規範,用於統一對象持久化操作的標準。其架構組成如下:

JPA的主要組成封裝於Javax.persistence.jar包中:

  1. Persistence****:主要提供靜態方法獲取EntityManagerFactory實例
  2. EntityManagerFactory****:作爲EntityMannage的工廠類,用於生產並管理多個EntityManager
  3. EntityManager****:****管理持久化對象,作爲數據庫操作的接口
  4. EntityTransaction****:用於管理EntityManager操作,每個EntityManager對應一個EntityTransaction
  5. Query****:由JPA供應商提供,能夠獲取一個標準的關係對象並執行數據庫操作
  6. Entity****:持久化對象/實體
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章