1、使用 Hibernate 操作數據庫
1-1、使用 ThreadLocal 控制 Session
應用程序根據配置文件構建應用程序運行的環境,建立全局范圍內的 SessionFactory 對象。其內部包含了 Hibernate 運行的全部細節,是產生 Session 的工廠,它是線程安全的,只能在系統啟動時實例化一次,系統運行期間不可修改。
Session 對象是 Hibernate 操作數據的核心,數據庫的操作、對象生命周期的管理、應用事務的劃分,都需要在 Session 對象中完成。Session 對象不是線程安全的,如果試圖讓多個線程同時使用一個 Session 對象,將會產生數據混亂,造成數據庫的數據不一致。而且頻繁開關 Session 是巨大的系統消耗。
為了安全地使用 Session 對象,需要應用 Java 語言中的線程綁定機制--ThreadLocal,它代表一個線程的私有存取空間,能夠隔離多線程環境中的并發機制,減少 Session 對象的創建和銷毀次數,降低系統資源浪費。

HibernateSessionFactory
1
public class HibernateSessionFactory
{
2

3
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
4

5
6
public static Session getSession() throws HibernateException
{
7
Session session = (Session) threadLocal.get();
8
9
if (session == null || !session.isOpen())
{
10
if (sessionFactory == null)
{
11
rebuildSessionFactory();
12
}
13
session = (sessionFactory != null) ? sessionFactory.openSession()
14
: null;
15
threadLocal.set(session);
16
}
17
18
return session;
19
}
20
21
.
22
23
public static void closeSession() throws HibernateException
{
24
Session session = (Session) threadLocal.get();
25
threadLocal.set(null);
26
27
if (session != null)
{
28
session.close();
29
}
30
}
31
32

33
34
}
1-2、建立數據庫結構
使用 Hibernate 時,設計生成數據庫表結構的方式分成兩種。
1、手工用 SQL 語句設計數據表結構
2、使用 Hibernate 根據映射文件自動構建數據庫模式
hibernate.cfg.xml:
<property name="hbm2dll.auto">creat</property>
<property name="show_sql">true</property>
log4j.properties
log4j.logger.org.hibernate.tool.hbm2dll=debug
Hibernate 自行管理的數據庫表結構:
● none:不產生任何動作。
● create:在應用啟動時,自動生成數據庫表結構并導入到數據庫中。
● create-drop:同 create,但在應用關閉時,刪除已生成的數據庫表結構;此方式常在測試時使用。
● update:在應用啟動時,檢查持久化類和映射文件的改變,更新數據庫表結構,比如:持久化類添加一個屬性后,Hibernate 能自動添加對應字段到對應的數據庫表中。
3、使用 Session 操作數據庫
Hibernate 能自動管理系統中的持久化類和數據庫模式,通過 Session 對象實現對象模型和關系模型的相互操作。
Session 提供數據訪問的接口:
● get():從數據庫獲取數據對象,不存在時則返回 null。
● load():從數據庫獲取數據對象,不存在時則拋出異常。
● createQuery():根據條件查詢數據對象。
● save()、update()、delete() 等方法。
2、Hibernate 基本組件接口
● Configuration(org.hibernate.cfg.Configuration)
Hibernate 應用的入口,它使用配置文件初始化運行環境,是 SessionFactory 的工廠。通常情況下,一個應用程序中只允許創建一個單例的 Configuration 實例。
● SessionFactory(org.hibernate.SessionFactory)
是一個線程安全的高速緩存,其中包含了單一數據庫和已編譯映射文件的元數據,在運行環境不可改變。它是 Session 的工廠,并能從 ConnectionProvider 中獲取 JDBC 連接。它可能持有一個可選的能在進程級別或者集群級別事務間重用的數據緩存(二級緩存)。SessionFactory 從 Configuration 中獲取,在一個應用范圍中,不允許改變。
● Session(org.hibernate.Session)
單線程的短生命周期的對象,是應用程序和持久化存儲的一次對話。封裝了一個 JDBC 連接,也是 Transaction 的工廠。它保持一個持久化對象的強制緩存(一級緩存),用來遍歷對象圖或者根據標識符查詢對象。Session 提供了一系列方法,可以方便地實現對象持久化操作。
● Transcation(org.hibernate.Transcation)
可選,單線程、短生命周期的對象,應用程序用它來表示一批任務的原子操作。是底層 JDBC,JTA 或者 CORBA 事務的抽象。一個 Session 在某些情況下可能跨越多個 Transcation 事務。
● ConnectionProvider(org.hibernate.connection.ConnectionProvider)
可選,JDBC 連接的工廠和連接池,是底層 Datasource 或 DriverManager 的抽象應用,對應用程序不可見。可擴展實現。
● TranscationFactory(org.hibernate.TranscationFactory)
可選,事務實例工廠。對應用程序不可見。可擴展實現。
在最小集合應用框架中,應用程序直接使用 JDBC/JTA,并自行完成事務處理。
conn = DriverManager.getConnection(xxx);
conn.setAutoCommit(false);
...
conn.commit();
3、Hibernate 生命周期
① Configuration 對象根據配置文件的設置,讀取屬性配置信息。
② Configuration 對象根據配置信息,按照映射文件、類緩存、集合緩存、監聽器、事件的順序依次讀取并解析。
③ 通過調用 Configuration 對象構建 SessionFactory。
④ 調用 SessionFactory 實例獲得 Session 對象。
⑤ 啟動事務。
⑥ 提交事務。
⑦ 關閉應用(Session 和 SessionFactory)。
4、Hibernate 中對象的狀態
為了區分持久化類的實例對象,根據對象和會話的關聯狀態,可以分為三種情況:
● 暫態狀態。對象剛建立,還沒有使用 Hibernate 進行保存。該對象在數據庫中沒有記錄,也不在 session 緩存中。如果該對象是自動生成主鍵,則該對象的對象標識符為空。
● 持久化對象。對象已經通過 Hibernate 進行了持久化,數據庫中已經存在對應的記錄。如果該對象是自動生成主鍵,則該對象的對象標識符已被賦值。
● 托管對象。該對象是經過 Hibernate 保存過或者從數據庫中取出的,但是與之關聯的 session 已經被關閉。雖然它擁有對象標識符,且數據庫中存在對應的記錄,但是已經不再被 Hibernate 管理。
ps. [轉] PO BO VO DTO POJO DAO概念及其作用(附轉換圖)
5、對象標識符
關系數據庫表的主鍵在 Java 應用環境中的體現。
5-1、關系型數據庫的主鍵生成機制
序列生成主鍵,整數
自動增長組件,整數
全局統一標識符 GUID(Globally Unique Identifier),字符串主鍵
5-2、Java 環境中的對象識別機制
引用比較,比地址 “==”
內容比較,比數據 equals() 方法
5-3、Hibernate 對象識別符的作用
在生成 Java 對象時,給標識屬性分配一個唯一的值,用于區分同一個類的多個不同的實例。體現在 Hibernate 中就是對象標識符。
5-4、Hibernate 內置標識符生成器的使用方法
org.hibernate.id.IdentifierGenerator 接口。
ps. 映射對象標識符
5-5、使用復合主鍵時組合標識符的使用方法(常用于遺留的系統中)
嵌入式組合標識符/映射式組合標識符,映射多個主鍵字段和持久化類的多個屬性。
6、配置 Hibernate
6-1、配置方式
可編程還是文件配置方式
Hibernate JDBC 配置屬性
hibernate.jdbc.fatch_size:指定 JDBC 抓取數據的數量大小,非零值
hibernate.jdbc.batach_size:允許 Hibernate 使用 JDBC2 的批量更新,非零值,建議 5 到 30
hibernate.jdbc.provider_class:自定義的 ConnectionProvider 類名,用于向 Hibernate 提供 JDBC 連接
hibernate.jdbc.autocommit:確認是否開啟 JDBC 自動提交功能,默認為 false 不自動提交
6-2、方言
屏蔽底層數據庫系統的方言機制,方便與數據庫間遷移。
MySQL:org.hibernate.dialect.MySQLDialect
MySQL with InnoDB:org.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAM:org.hibernate.dialect.MySQLMyISAMDialect
6-3、Hibernate 日志系統
使用 Log4J 作為 Hibernate 的日志系統,需要將 Log4J 的庫文件 log4j.jar 放置到類路徑下(其發布包以包含 Log4J 的庫文件)。然后編寫日志配置文件 log4j.properties 并放到 classpath 路徑中。
Log4J 中,幾個日志輸出級別的順序是:只輸出高于或等于 設定級別 的記錄。
trace < debug < info < warn < error < fatal
在開發模式中,可以選擇 DEBUG 級別的輸出;應用部署后,可以配置為 ERROR。

log4j.properties
1
#設置日志根級別和輸出路徑
2
log4j.rootLogger=INFO,CONSOLE,FILE
3
4
#日志輸出路徑——控制臺
5
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
6
log4j.appender.stdout.Target=System.out
7
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
8
log4j.appender.CONSOLE.layout.ConversionPattern=%d|ABSOLUTE %5p %c|1|:%L - %m%n
9
10
#日志輸出路徑——文件
11
log4j.appender.FILE=org.apache.log4j.FileAppender
12
log4j.appender.FILE.File=hibernate.log
13
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
14
log4j.appender.FILE.layout.ConversionPattern=%d|ABSOLUTE %5p %c|1|:%L - %m%n
15
16
#日志輸出級別
17
log4j.logger.org.hibernate=INFO
18
19
#日志輸出類別
20
log4j.logger.org.hibernate.hql.ast.AST=WARN
21
log4j.logger.net.sf.ehcache=INFO
22
log4j.logger.org.hibernate.SQL=DEBUG
7、Hibernate 映射類型
7-1、時間日期映射類型(內置映射類型)
Java 語言提供了 java.util.Date 和 java.util.Calendar 兩個類實現時間的運算。此外,JDBC 還提供了 java.util.Date 的三個擴展類 java.sql.Timestamp、java.sql.Time 和 java.sql.Date 分別對應標準 SQL 數據類型中的 TIMESPAME/DATETIME(時間日期)、TIME(時間)、DATE(日期)。
java.util.Date/java.sql.Date H:date SQL:DATE
java.util.Time/java.sql.Time H:time SQL:TIME
java.util.Date/java.sql.Timestamp H:timestamp SQL:TIMESTAMP/DATETIME
java.util.Calendar H:calendar SQL:TIMESTAMP/DATETIME
java.util.Calendar H:calendar_date SQL:DATE
7-2、自定義映射類型
posted on 2009-04-11 10:45
黃小二 閱讀(496)
評論(0) 編輯 收藏 所屬分類:
S/S2SH 、
J2EE 、
J2SE