@ Hibernate3.0 àJBOSS
@ ORM à「對(duì)象/對(duì)應(yīng)關(guān)系」(Object/Relational Mapping)
@ Hibernate3.0 依賴底層的JDBC2.0
Hibernate入門 - 包作用詳解 (25個(gè)jar)
@必須的jar
hibernate3.0.jar: 必須使用的jar包
antlr.jar: Hibernate使用ANTLR來產(chǎn)生查詢分析器
EHCache.jar: Hibernate可以使用不同cache緩存工具作為二級(jí)緩存。缺省的cache緩存
cglib-asm.jar: Hibernate用它來實(shí)現(xiàn)PO字節(jié)碼的動(dòng)態(tài)生成,非常核心的庫(kù),
dom4j.jar: 是一個(gè)Java的XML API, Hibernate用它來讀寫配置文件。
odmg.jar:是一個(gè)ORM的規(guī)范,Hibernate實(shí)現(xiàn)了ODMG規(guī)范,這是一個(gè)核心的庫(kù), commons-collections.jar:包含了一些Apache開發(fā)的集合類
commons-beanutils.jar:,包含了一些Bean工具類類。必須使用的jar包。
commons-lang.jar:些數(shù)據(jù)類型工具類,是java.lang.*的擴(kuò)展。必須使用的jar包
commons-logging.jar:包含了日志功能。
@可選的:
ant.jar: Ant編譯工具的jar包,用來編譯Hibernate源代碼的。
optional.jar: Ant的一個(gè)輔助包。
c3p0.jar: C3PO是一個(gè)數(shù)據(jù)庫(kù)連接池,Hibernate可以配置為使用C3PO連接池。
proxool.jar: 也是一個(gè)連接池,同上。
commons-pool.jar:commons-dbcp.jar: Tomcat4的連接池也是DBCP。
在EJB中使用Hibernate,一定要用App Server的連接池,否則容器管理事務(wù)不起作用.
connector.jar: JCA 規(guī)范, App Server上把Hibernate配置為Connector的話用。
Jaas.jar: JAAS是用來進(jìn)行權(quán)限驗(yàn)證的,已經(jīng)包含在JDK1.4里面了。
jcs.jar: 如果你準(zhǔn)備在Hibernate中使用JCS的話,那么必須包括它,否則就不用。
jdbc2_0-stdext.jar: JDBC2.0的擴(kuò)展包,一般來說數(shù)據(jù)庫(kù)連接池會(huì)用上它。
jta.jar: JTA規(guī)范,當(dāng)Hibernate使用JTA的時(shí)候需要,
junit.jar: Junit包,當(dāng)你運(yùn)行Hibernate自帶的測(cè)試代碼的時(shí)候需要,否則就不用。
xalan.jar:xerces.jar:xml-apis.jar:
Xerces是XML解析器,Xalan是格式化器,xml-apis實(shí)際上是JAXP。一般App Server都會(huì)帶上, Hibernate用XML只不過是讀取配置文件。
@ log4j.properties
Hibernate包的etc目錄下的log4j.properties復(fù)制到Hibernate項(xiàng)目的Classpath下,
修改log4j.logger.org.hibernate = error!
@ 實(shí)體對(duì)象的加載!
<hibernate-configuration>
<session-factory>
<!-- 對(duì)象與數(shù)據(jù)庫(kù)表的映射文件 -->
<mapping resource="onlyfun/caterpillar/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
@ 獲得負(fù)責(zé)管理Hibernate的配置信息的Configuration用session的操作
Configuration config = new Configuration().configure();
//configure()默認(rèn)./Hibernate.cfg.xml; 當(dāng)然也可以指定URL
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx= session.beginTransaction();
session.save(user);// user實(shí)體
tx.commit();
session.close();
sessionFactory.close();
@ Criteria的API不完善.
Session中的find()方法被取消了,必須使用Session的createQuery()建立Query實(shí)例,並使用list()方法來取代。Session的iterate()被取消了,由Query介面上的iterator()來取代,詳請(qǐng)看 Query.list()、iterator()。
新增 update 語句
Query query = session.createQuery("update User set age=30 where id=1");
query.executeUpdate();
新增 delete 語句
Query query = session.createQuery("delete User where age<20");
query.executeUpdate();
Query:
1:query = session.createQuery("from User user where user.name like ?");
query.setParameter(0, "caterpillar");
2 :Query query = session.createQuery("select user.name from User as user where user.age > :minAge");
query.setInteger("minAge", 25);
4. 悲觀鎖定(Pessimistic Locking)
悲觀鎖定通常透過系統(tǒng)或資料庫(kù)本身的功能來實(shí)現(xiàn),依賴系統(tǒng)或資料庫(kù)本身提供的鎖定機(jī)制,Hibernate即是如此,可以利用Query或Criteria的setLockMode()方法來設(shè)定要鎖定的表或列(Row)及其鎖定模式,可設(shè)定的鎖定模式有以下的幾個(gè):
- LockMode.UPGRADE:利用資料庫(kù)的for update子句進(jìn)行鎖定。
- LockMode.UPGRADE_NOWAIT:使用for update nowait子句進(jìn)行鎖定,在Oracle資料庫(kù)中使用
Query query = session.createQuery("from User user");
query.setLockMode("user", LockMode.UPGRADE);
也可以在使用Session的load()或是lock()時(shí)指定鎖定模式以進(jìn)行鎖定。
另外還有三種加鎖模式Hibernate內(nèi)部自動(dòng)對(duì)資料進(jìn)行鎖定,與資料庫(kù)無關(guān):
- LockMode.WRITE:在insert或update時(shí)進(jìn)行鎖定,Hibernate會(huì)在save()方法時(shí)自動(dòng)獲得鎖定。
- LockMode.READ:在讀取記錄時(shí)Hibernate會(huì)自動(dòng)獲得鎖定。
- LockMode.NONE:沒有鎖定。
如果資料庫(kù)不支援所指定的鎖定模式,Hibernate會(huì)選擇一個(gè)合適的鎖定替換,而不是丟出一個(gè)例外
5: Lifecycle 介面、Validatable 介面
可以在實(shí)體物件定義時(shí)實(shí)作Lifecycle介面,這個(gè)介面定義如下:
package org.hibernate.classic;
import java.io.Serializable;
import org.hibernate.CallbackException;
import org.hibernate.Session;
public interface Lifecycle {
public static final boolean VETO = true;
public static final boolean NO_VETO = false;
public boolean onSave(Session s) throws CallbackException;
public boolean onUpdate(Session s) throws CallbackException;
public boolean onDelete(Session s) throws CallbackException;
public void onLoad(Session s, Serializable id);
}
當(dāng)物件實(shí)作Lifecycle介面時(shí),會(huì)在save()、update()、delete()、load()等方法執(zhí)行之前呼叫對(duì)應(yīng)的onSave()、 onUpdate()、onDelete()與onLoad(),其中onSave()、onUpdate()、onDelete()與onLoad() 若傳回true或丟出CallbackException,則對(duì)應(yīng)的操作中止。
可以在實(shí)體物件定義時(shí)實(shí)作Validatable介面,其定義如下:
package org.hibernate.classic;
public interface Validatable {
public void validate() throws ValidationFailure;
}
如果定義時(shí)實(shí)作了Validatable介面,當(dāng)物件被持久化之前會(huì)呼叫validate()方法,如果丟出ValidationFailure,則驗(yàn)證失敗,物件的資料不會(huì)儲(chǔ)存至資料庫(kù)中
您可以在開啟Session時(shí)載入一個(gè)自訂Interceptor,這個(gè)Interceptor會(huì)在對(duì)應(yīng)的動(dòng)作發(fā)生之前呼叫對(duì)應(yīng)的方法,方法是讓您定義的Interceptor實(shí)作Interceptor介面,介面的定義如下:
package org.hibernate;
import java.io.Serializable;
import java.util.Iterator;
import org.hibernate.type.Type;
public interface Interceptor {
// 載入物件之前執(zhí)行
public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException;
// flush 時(shí),如果發(fā)現(xiàn)有Dirty data,則執(zhí)行此方法
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) throws CallbackException;
// 儲(chǔ)存物件前執(zhí)行
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException;
// 刪除物件前執(zhí)行
public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException;
// 在 flush 前執(zhí)行
public void preFlush(Iterator entities) throws CallbackException;
// 在 flush 後執(zhí)行
public void postFlush(Iterator entities) throws CallbackException;
// 判斷傳入的物件是否為 transient 狀態(tài)
public Boolean isTransient(Object entity);
// flush 前呼叫這個(gè)方法判斷 Dirty data
// 傳回Dirty data屬性索引或null採(cǎi)預(yù)設(shè)行為
public int[] findDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types);
// 手動(dòng)建立實(shí)體物件,如果傳回 null,則使用預(yù)設(shè)的建構(gòu)方法建立實(shí)例
public Object instantiate(String entityName, EntityMode entityMode, Serializable id) throws CallbackException;
// 傳回實(shí)體名稱
public String getEntityName(Object object) throws CallbackException;
// 取得實(shí)體物件
public Object getEntity(String entityName, Serializable id) throws CallbackException;
// beginTransaction() 之後執(zhí)行
public void afterTransactionBegin(Transaction tx);
// 在事務(wù)完成前執(zhí)行
public void beforeTransactionCompletion(Transaction tx);
// 在事務(wù)完成後執(zhí)行
public void afterTransactionCompletion(Transaction tx);}
假設(shè)您實(shí)作了SomeInterceptor類別:
package onlyfun.caterpillar;
....
public class SomeInterceptor implements Interceptor {
....
}
在開啟Session時(shí),可以如下載入自訂的Interceptor:
SomeInterceptor someInterceptor = new SomeInterceptor();
Session session = sessionFactory.openSession(someInterceptor);