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