Hibernate是一個開放源代碼的對象關系映射(Object Relation Mapping,簡稱ORM)框架,同時也是java領域的一個持久化框架。
框架可以看做一個半成品,基于此可提高開發效率、減少代碼量、提高程序的健壯性等。
狹義的理解,持久化僅指將對象永久保存在數據庫中;而廣義的理解則包括與數據庫相關的增刪改查和加載操作。 其中,加載是指根據特定的OID將一個對象從數據庫加載到內存中。為了在系統中能夠找到所需對象,需要為每一個對象分配唯一的標識號;在關系數據庫中稱之為主鍵,而在對象術語中,則叫做對象標識(Object identifier,簡稱OID)。
ORM框架的功能是實現對象與關系的映射,其思想是將關系數據庫中表的記錄映射為對象,程序員可以把對數據庫的操作直接轉化為對對象的操作。其中,具體映射關系如下圖所示:
| 面向對象概念 | 面向關系概念 |
|---|---|
| 類 | 表 |
| 對象 | 表的行(記錄) |
| 屬性 | 表的列(字段) |
ORM框架采用元數據(描述數據的數據)來描述對象關系映射細節,元數據通常采用xml格式存放在專門的對象關系映射文件中。 其中,ORM框架架構如下圖所示:
就目前而言,較為流行的ORM框架主要有Hibernate、myBatis、TopLink、OJB等。其中,Hibernate框架較為成熟、可完成對象的持久化操作、允許開發者采用面向對象的方式來操作關系數據庫、可消除針對特定數據庫廠商的SQL代碼;然而,myBatis框架相比Hibernate更為靈活、運行速度快,但其開發速度慢、不支持純粹的面向對象操作、需熟悉sql語句并且熟練使用sql語句優化功能。
Hibernate插件可使開發更為簡單方便,因此需要在開發前進行安裝;在此,選擇的安裝文件為hibernatetools-Update-4.1.1.Final_2013-12-08_01-06-33-B605.zip。
Hibernate的具體實現步驟示意圖如下圖所示: 

Hibernate從其配置文件中讀取和數據庫連接的有關信息,該文件應位于應用的classpath下。具體示例代碼如附錄hibernate.cfg.xml文件所示。
Hibernate被稱為低浸入式設計框架,因為其持久化類不需要繼承任何父類或實現任何接口,可保證代碼不被污染;該持久化類主要有以下要求:
提供無參的構造器:使Hibernate需要使用Constructor.newInstance()來實例化持久化類;提供標識屬性(identifier PRoperty):其映射為數據庫表的主鍵字段,若沒有該屬性一些功能則不起作用,如session.saveOrUpdate();為類的持久化類字段聲明訪問方法(get/set): Hibernate對JavaBeans風格的屬性實行持久化;使用非final類: 在運行時生成代理是Hibernate的一個重要功能;如果持久化類沒有實現任何接口,Hibnernate使用CGLIB生成代理,但若使用final類,則無法生成CGLIB代理;重寫eqauls()和hashCode()方法:如果需要把持久化類的實例放到Set中(當需要進行關聯映射時), 則需要重寫。Hibernate采用XML格式文件來指定對象和關系數據之間的映射,其在運行時 將根據該映射文件來生成所對應的SQL語句。具體示例代碼如附錄News.hbm.xml文件所示。
作用:負責管理Hibernate的配置信息,主要包括Hibernate運行的底層信息(如數據庫的URL、用戶名、密碼、JDBC驅動類、數據庫連接池、數據庫Dialect等,對應hibernate.cfg.xml文件)和持久化類與數據表的映射關系(對應*.hbm.xml 文件)。 創建Configuration對象:
若采用hibernate.properties文件配置,則Configuration cfg = new Configuration();若采用hibernate.cfg.xml文件配置,則Configuration cfg = new Configuration().configure(),且Configuration對象的configure()方法還支持帶參數的訪問。Session對象是應用程序與數據庫之間交互操作的一個單線程對象,是Hibernate的運作中心,所有持久化對象必須在Session的管理下才可以進行持久化操作;另外,此對象生命周期很短,且具有一個一級緩存,顯式執行flush()方法前,所有的持久層操作的數據都緩存在Session對象處,其相當于JDBC中的Connection。 注意:持久化類與Session關聯起來后就具有了持久化的能力。其中,Session接口的常用方法主要有:
開啟事務:beginTransaction(); 取得持久化對象的方法:get()、load();持久化對象的操作:save()、update()、saveOrUpdate()、delete();管理Session對象:isOpen()、flush()、clear()、evict()、close()等。其代表一次原子操作,具有數據庫事務的概念,即所有持久層操作都應該在事務管理下進行,包括只讀操作。其常用方法主要有:
rollback():撤銷事務操作;wasCommitted():檢查事務是否提交;commit():提交事務,即提交相關聯的session實例。代碼結構: 
hibernate.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <!-- 1. 配置連接數據庫的基本信息 --> <property name="connection.username">root</property> <property name="connection.passWord">root</property> <property name="connection.driver_class">com.MySQL.jdbc.Driver</property> <!-- jdbc:mysql://localhost:3306/hibernate localhost:3306為默認的,可以去除 --> <property name="connection.url">jdbc:mysql:///hibernate</property> <property name="connection.username"></property> <!-- 2. 配置Hibernate的基本信息 --> <!-- 2.1 配置Hibernate所使用的數據庫方言 --> <!-- 可在hibernate-release-4.2.4.Final/project/etc/hibernate.properties文件中查找 --> <property name="dialect">hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect</property> <!-- 2.2 執行操作時是否在控制臺打印SQL語句 --> <property name="show_sql">true</property> <!-- 2.3 執行操作時是否是否對SQL進行格式化 --> <property name="format_sql">true</property> <!-- 2.4 指定執行操作時自動生成數據表的策略,共有四種取值 --> <!-- create : 根據*.hbm.xml文件來生成數據表,但每次運行都會刪除舊表創建新表,即使數據表內容沒有改變; create-drop : 根據*.hbm.xml文件生成數據表,但SessionFactory對象關閉即刪除數據表; update : 最常用的屬性值,也會根據*.hbm.xml文件生成數據表表, 但若*.hbm.xml文件與數據庫中對應數據表結構不同,Hiberante將更新數據表結構,但不會刪除已有的行和列; validate : 會與數據庫中的表進行比較,若*.hbm.xml文件中的列在數據表中不存在,則拋出異常。 --> <property name="hbm2ddl.auto">update</property> <!-- 2.5 指定所關聯的對象關系映射文件 --> <mapping resource="com/qiaobc/hibernate/helloworld/News.hbm.xml"/> </session-factory></hibernate-configuration>News.java:
package com.qiaobc.hibernate.helloworld;import java.sql.Date;public class News { private Integer id; private String title; private String author; private Date date; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public News(Integer id, String title, String author, Date date) { super(); this.id = id; this.title = title; this.author = author; this.date = date; } public News() { super(); } @Override public String toString() { return "News [id=" + id + ", title=" + title + ", author=" + author + ", date=" + date + "]"; }}News.hbm.xml:
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-2-19 16:24:21 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping> <class name="com.qiaobc.hibernate.helloworld.News" table="NEWS"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <!-- 指定主鍵的生成方式 native:使用數據庫本地的方式 --> <generator class="native" /> </id> <property name="title" type="java.lang.String"> <column name="TITLE" /> </property> <property name="author" type="java.lang.String"> <column name="AUTHOR" /> </property> <property name="date" type="java.sql.Date"> <column name="DATE" /> </property> </class></hibernate-mapping>HibernateTest.java:
package com.qiaobc.hibernate.helloworld;import java.sql.Date;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.Test;public class HibernateTest { @Test public void test() { // 1. 創建SessionFactory對象 SessionFactory sessionFactory = null; // 1). 創建Configuration對象:對應Hibernate基本配置信息和對象關系映射信息 Configuration configuration = new Configuration().configure(); // Hibernate4.0之前這樣創建 // sessionFactory = configuration.buildSessionFactory(); // 2). 創建一個ServiceRegistry對象:Hibernate4.x新增 // Hibernate的任何配置和服務都需要在該對象中注冊后才能有效 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()) .buildServiceRegistry(); // 3). 創建SessionFactory對象 sessionFactory = configuration.buildSessionFactory(serviceRegistry); // 2. 創建Session對象 Session session = sessionFactory.openSession(); // 3. 開啟事務 Transaction transaction = session.beginTransaction(); // 4. 執行保存操作 News news = new News(null, "qiaobc", "qiaob", new Date( new java.util.Date().getTime())); session.save(news); // 5. 提交事務 transaction.commit(); // 6. 關閉Session對象 session.close(); // 7. 關閉SessionFactory對象 sessionFactory.close(); }}新聞熱點
疑難解答