Hibernate的相關概念 以及 序列化和持久化的區別



一. Hibernate 初識

hibernate是一種ORM(object relation mapping,對象關係映射)框架,所謂的對象關係映射,通俗的說,就是把JAVA對象保存到關係型數據庫中。

hibernate要做的事,就是讓對象投影到關係數據庫中,然後實施持久化。其具體實現:建立對象到關係數據庫的映射.

Example:  建立User類到數據庫的映射
一個簡單的類User:

  public class User{
      private int id;
      private String name;
  }

User類對應的數據庫表USER:
column-name type rule
id number P
name varchar2 R

當進行持久化時,需要把對象的兩個屬性的值保存到數據庫存的USER中,如果使用JDBC的話,我們需要自己寫SQL,並獲取對象兩個屬性的值作爲參數來進行持久話。SQL可能如下:
insert into USER(name) value(?);

當使用hibernate時,首無要作好對象到表的映射關係,使用配置文件來實現:
User.hbm.xml:
...
<class name="user" table="USER"><!--該類對象保存到USER表-->
<id name="id" column="id">
<generator class="native"/><!--這裏有很多策略來生成ID,這裏選擇本地自動生成,-->
</id>
<property name="name" column="name">
</class>
...

然後在通過hibernate.cfg.xml中配置到數據庫的聯接,並讀取User.hbm.xml文件,就建立了映射關係了。

當需要持久化對象時,需要使用到hibernate的session對象:
session.save(new User());
看到了嗎?我們只需要操作對象就行了,也就是說,編程的人不需要看到數據庫了,他只需要直接操作對象就行了。

當我們採用ORM框架之後,應用程序不再直接訪問底層的數據庫,而是以面向對象的方式來操作持久化對象(例如創建、修改、刪除等),而ORM框架則將這些面向對象操作轉換成底層的SQL操作。

hibernate 如何實現持久化?
答:
1.hibernate是一種ORM(object relation mapping,對象關係映射)框架,所謂的對象關係映射,通俗的說,就是把JAVA對象保存到關係型數據庫中,即進行持久化的框架。

2.hibernate進行持久化首先要建立對象到關係數據庫的映射。

3.hibernate根據定義的映射規則將對象持久化(保存到)數據庫存中。這就實現了對象持久化。



二. 序列化和持久化的區別

序列化也是一種對象服務,就是把內存中的對象序列化成流、或者把流反序列化成對象。需要實現2個接口:

voidSerialize(Streamstream,object o) 把對象序列化到流中
object Deserialize(Stream stream) 把流反序列化成對象

序列化和持久化很相似,有些人甚至混爲一談,其實還是有區別的,

序列化是爲了解決對象的傳輸問題,傳輸可以在線程之間、進程之間、內存外存之間、主機之間進行。我之所以在這裏提到序列化,是因爲我們可以利用序列化來輔助持久化,可以說凡是可以持久化的對象都可以序列化,因爲序列化相對容易一些(也不是很容易),所以主流的軟件基礎設施,比如.net和java,已經把序列化的框架完成了。

持久化(Persistence),即把數據(如內存中的對象)保存到可永久保存的存儲設備中(如磁盤)。持久化的主要應用是將內存中的對象存儲在的數據庫中,或者存儲在磁盤文件中、XML數據文件中等等。持久化是將程序數據在持久狀態和瞬時狀態間轉換的機制。 JDBC就是一種持久化機制。文件IO也是一種持久化機制。

持久化方案可以分爲關係數據庫方案、文件方案、對象數據庫方案、xml數據庫方案,現今主流的持久化方案是關係數據庫方案,關係數據庫方案不僅解決了併發的問題,更重要的是,關係數據庫還提供了持久化服務之外的價值:統計分析功能。剛纔我說到,凡是可以序列化的對象都可以持久化,極端的說,我們可以只建立一個表Object(OID,Bytes),但基本上沒有人這麼做,因爲一旦這樣,我們就失去了關係數據庫額外的統計分析功能。



首先要說的是,Hibernate中ORM裏對應的映射文件BEAN,必須實現序列化.因爲BEAN裏的數據需要存入數據庫(要轉化爲二進制保存),進行存取工作.

 JAVA類的數據 ,如果要進行相關的存儲工作(如寫文件,網絡傳輸,寫數據庫等),那麼這個數據的類 就必須實現序列化接口 (java.io.Serializable). 
        序列化 :  把對象轉換 爲二進制數據(如網絡傳輸,存儲數據庫等),必須實現序列化接口 (java.io.Serializable).
        持久化 :  把對象保存 在介質上(如寫文件,讀文件不是), 沒有接口實現,一般指方法調用. 

對象只有在序列化之後才能進行持久化存儲,從持久化存儲介質加載的數據通過反序列化轉變成運行時對象。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章