歡迎您光臨本站 註冊首頁

Hibernate中重要對象的詳解

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

  ★→→SessionFactory (org.hibernate.SessionFactory)

  包含已經編譯的映射(mappings),是製造session的工廠,可能含有一些可以在

  各個事務(transaction)之間共享的數據

  (1) SessionFactory的緩存

  可分為兩類:內置緩存和外置緩存.

  SessionFactory的內置緩存中存放了Hibernate配置信息和映射元數據信息、同時也緩存了Hibernate自動生成的SQL語句等;

  SessionFactory的外置緩存是一個可配置的緩存插件,在默認情況下,SessionFactory不會啟用這個緩存插件.外置緩存

  能存放大量資料庫數據的拷貝,外置緩存的物理介質可以是內存或者硬碟.

  (2) 只有一個數據存儲源,只需創建一個SessionFactory

  SessionFactory就是個重量級對象,如果應用只有一個數據存儲源,只需創建一個SessionFactory實例,

  因為隨意地創建SessionFactory實例會佔用大量內存空間.

  但是當你的項目要操作多個資料庫時,那你必須為每個資料庫指定一個SessionFactory.

  (3) Configuration的其他用法

  Configuration的configure ()方法還支持帶參數的訪問方式,你可以指定hbm.xml文件的位置,而不是使用默認的classpath

  下面的hibernate.cfg.xml這種方式,例如:

  Configuration cfg = new Configuration().configure("myexample.xml");

  ★★→→Configuration

  Configuration是hibernate的入口,在新建一個Configuration的實例的時候,hibernate會在classpath裡面查找

  hibernate.properties文件,如果該文件存在,則將該文件的內容載入到一個Properties的實例GLOBAL_PROPERTIES裡面,

  如果不存在,將列印信息:hibernate.properties not found

  然後是將所有系統環境變數(System.getProperties())也添加到GLOBAL_PROPERTIES裡面.如果hibernate.properties文件存在,

  系統還會驗證一下這個文件配置的有效性,對於一些已經不支持的配置參數,系統將列印警告信息.

  (1) 作用---實現對Hibernate進行配置

  Configuration介面的作用是對Hibernate進行配置,以及對它進行啟動

  在Hibernate的啟動過程中,Configuration類的實例定位映射文檔的位置,讀取這些配置,然後創建一個SessionFactory對象.

  根據Configuration對象創建一個SessionFactory對象

  為了能創建一個SessionFactory對象,你必須在Hibernate初始化時創建一個Configuration類的實例,並將已寫好的映射文件交由它處理.

  這樣,Configuration對象就可以創建一個SessionFactory對象,當SessionFactory對象創建成功后,Configuration對象就沒有用了,你可以簡單地拋棄它.

  (2) 它是啟動hibernate的對象

  雖然Configuration介面在整個Hibernate項目中只扮演著一個很小的角色,但它是啟動hibernate時你所遇到的第一個對象.

  (3) Configuration config = new Configuration();

  config.addClass(Customer.class);

  sessionFactory = config.buildSessionFactory();

  或者:

  使用方法鏈編程風格,可以改寫為:

  sessionFactory = new Configuration().buildSessionFactory().addClass(Customer.class).buildSessionFactory();

  注意:

  方法鏈編程風格能使應用程序代碼更加簡捷.在使用這種編程風格時,最好把每個調用方法放在不同的行,否則在跟蹤程序時,無法跳入每個調用方法中.

  ★★★→→Session(org.hibernate.Session)

  (1) 單線程的,短壽命的對象,代表了一次會話的過程.實際上是把一個JDBC Connection打包

  了,它可以包含一些持久化對象的緩存

  看作介於數據連接與事物管理一種中間介面.

  在hibernate的設計者中.他們將session看作介於數據連接與事物管理的一種中間介面

  或者想象成一個持久對象的緩衝區

  hibernate能檢測到這些持久對象的改變,並及時刷新資料庫

  (2) 每一個Session實例和一個資料庫事務綁定

  通常將每一個Session實例和一個數據處理庫事務綁定

  就是說,每執行一個資料庫事務(操作),都應該先創建一個新的Session實例.

  如果事務執行中出現異常,應該撤消事務.

  不論事務執行成功與否,都應該調用Session的close()方法,從而釋放Session實例

  佔用的資源.

  (3) 如何獲得Session對象

  創建SessionFactory對象

  應用伺服器如果訪問多個數據源時,則應該產生多個SessionFactory;

  但是僅僅為了服務與某個請求時,不要創建一個新的SessionFactory,因為創建

  SessionFactory需要消耗大量的資源.

  然後根據SessionFactory再創建Session對象

  例如:::::

  ----------------------------------------------------------------------------------

  Session session=sessionFactory.openSession();

  Transaction tx;

  try{

  tx=session.beginTransaction();//開始一個事務

  .......//執行事務

  tx.commit();

  }catch(Exception e){//如果出現異常就撤消事務

  if(tx!=null)

  tx.rollback();

  throw e;

  }

  finally//不管事務執行成功與否,都關閉Session並且放在finally中以提高安全性

  session.close();

  -----------------------------------------------------------------------------------

  (4) Sessin 介面中的常用方法

  基本的CURD操作(save()方法:把Java對象保存資料庫中、update()方法:更新數據

  庫中的Java對象、delete()方法:把Java對象從資料庫中刪除、load()方法:從數據

  庫中載入Java對象 和find()方法:從資料庫中查詢Java對象);執行查詢;

  ◆ save()方法:save() 和persist()方法產生SQL INSERT

  session = HibernateUtil.currentSession();

  tx = session.beginTransaction();

  Book oneBook = new Book();

  oneBook.setBookName(new String("J2EE應用開發".getBytes("gb2312"), "ISO8859-1"));

  oneBook.setBookKind('1');

  oneBook.setBookPrice(7.4f);

  session.save(oneBook);

  tx.commit();

  ◆ Sessin 介面中的常用方法---- updata()和merge()方法產生SQL UPDATE

  該方法調用Session的load()方法,載入Customer對象,然後再修改Customer對象的屬性.

  session = HibernateUtil.currentSession();

  tx = session.beginTransaction();

  Book oneBook=(Book)session.load(Book.class,bookID);

  oneBook.setBookName(new String("Java應用開發".getBytes("gb2312"), "ISO8859-1"));

  oneBook.setBookKind('1');

  oneBook.setBookPrice(10.4f);

  tx.commit();

  ◆ Sessin 介面中的常用方法---- load和get方法

  session的load和get方法根據給定的OID從資料庫中載入一個對象,load方法在沒有找 到對象時拋出notFoundException異常,get方法返回null;

  get和load和其他查詢方法返回的對象位於session的緩存中,修改了對象的屬性后, session清理緩存時,會根據持久化對象的屬性來更新資料庫.

  用來對資料庫中檢索對象,load()和get()方法按照給定的OID載入一個持久化對象

  public Iterator getAllCourses()throws HibernateException

  {

  String queryString = "select courses from Course as courses";

  beginTransaction();

  Query query = session.createQuery(queryString);

  Iterator it= query.iterate();

  return it;

  }

  /**

  *按course的名字進行模糊查找,返回的是包含有Course持久對象的Iterator.

  */

  public Iterator getSomeCourse(String name)throws HibernateException

  {

  String queryString = "select c from Course as c where c.name like :name" ;

  beginTransaction();

  Query query = session.createQuery(queryString);

  query.setString("name", "%" name "%");

  Iterator it= query.iterate();

  return it;

  }

  ◆ Sessin 介面中的常用方法---- delete()方法產生SQL DELETE

  由於從資料庫中刪除對象對應的記錄,如果出入的是持久化對象session就計劃執行一個delete語句.

  如果出入的參數是遊離態對象,先使它成為持久化對象,然後計劃執行一個delete語句.session只有在清理緩存的時候才會執行delete語句.

  只有當調用session的close()方法時才會從session的緩存中刪除對象.

  session = HibernateUtil.currentSession();s

  tx = session.beginTransaction();

  Book oneBook=(Book)session.load(Book.class,bookID);

  session.delete(oneBook);

  tx.commit();

  ★★★★→→Transaction

  ★★★★★→→Query查詢對象

  Query介面讓你方便地對資料庫及持久對象進行查詢,它可以有兩種表達方式:HQL語言或本地資料庫的SQL語句.

  Query經常被用來綁定查詢參數、限制查詢記錄數量,並最終執行查詢操作.

  Query query=session.createQuery();

  List list = query.list();//把query查詢對象放到Query的list裡面,返回一個query對象

  ★★★★★★Callback 方面的介面

  當一些有用的事件發生時――例如持久對象的載入、存儲、刪除時,Callback介面會通知Hibernate去接收一個通知消息---它允許

  應用程序能對一些事件的發生作出相應的操作.例如Interceptor、Lifecycle和Validatable都是這一類介面.一般而言,

  Callback介面在用戶程序中並不是必須的,但你要在你的項目中創建審計日誌時,你可能會用到它.

  ◎第一步.---->獲取Sessionfactory對象

  Sessionfactory sf=new Configuration().configure().buildSessionFactory();

  ◎第二步.---->創建session對象

  Session session=sf.openSession();

  ◎第三步.---->獲取對資料庫操作前的事物對象

  Transaction tx=session.beginTransaction();

  ◎第四步.---->利用session的多個方法進行數據操作.例如:session.save(實體bean對象);session.update(實體bean對象)等;

  ◎第五步.---->tx.commit();保存持久化資料庫操作;

  ◎ 數據其他操作.比如查詢Query query=session.createQuery("from student where username='" username"'");//student為一個實體bean對象.就是與hbm.xml對應的和資料庫映射的一個 javabean.

  其他介面::::::::::::::::::

  :::::::::::::::::::::::::::::::::::::::::? 主鍵的生成 (IdentifierGenerator 介面)

  # 本地SQL語言支持 (Dialect 抽象類)

  # 緩衝機制 (Cache 和CacheProvider 介面)

  # JDBC 連接管理 (ConnectionProvider介面)

  # 事務管理 (TransactionFactory, Transaction, 和 TransactionManagerLookup 介面)

  # ORM 策略 (ClassPersister 介面)

  # 屬性訪問策略 (PropertyAccessor 介面)

  # 代理對象的創建 (ProxyFactory介面)

  本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/xuanlanbaicai/archive/2008/08/28/2845050.aspx


[火星人 ] Hibernate中重要對象的詳解已經有683次圍觀

http://coctec.com/docs/java/show-post-60734.html