成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

簡述Hibernate中加載并存儲對象

開發 后端
Hibernate Session的生命周期可以很靈活,但是你絕不要把你的應用程序設計成為每一次數據庫操作都用一個新的Hibernate Session。

本文主要向大家介紹Hibernate加載并存儲對象,下面我們用一個例子來加以說明。讓你更輕松的了解Hibernate中加載并存儲對象的好處。

首先要編寫一個帶有main()方法的EventManager類:

  1. package events;  
  2. import org.hibernate.Session;  
  3.  
  4. import java.util.Date;  
  5.  
  6. import util.HibernateUtil;  
  7.  
  8. public class EventManager {  
  9.  
  10.     public static void main(String[] args) {  
  11.         EventManager mgr = new EventManager();  
  12.  
  13.         if (args[0].equals("store")) {  
  14.             mgr.createAndStoreEvent("My Event", new Date());  
  15.         }  
  16.  
  17.         HibernateUtil.getSessionFactory().close();  
  18.     }  
  19.  
  20.     private void createAndStoreEvent(String title, Date theDate) {  
  21.  
  22.         Session session = HibernateUtil.getSessionFactory().getCurrentSession();  
  23.  
  24.         session.beginTransaction();  
  25.  
  26.         Event theEvent = new Event();  
  27.         theEvent.setTitle(title);  
  28.         theEvent.setDate(theDate);  
  29.  
  30.         session.save(theEvent);  
  31.  
  32.         session.getTransaction().commit();  
  33.     }  
  34.  
  35. }  

我們創建了個新的Event對象并把它傳遞給Hibernate?,F在Hibernate負責與SQL打交道,并把INSERT命令傳給數據庫。在運行之前,讓我們看一下處理Session和Transaction的代碼。

一個Session就是個單一的工作單元。我們暫時讓事情簡單一些,并假設HibernateSession和數據庫事務是一一對應的。為了讓我們的代碼從底層的事務系統中脫離出來(此例中是JDBC,但也可能是JTA),我們使用Hibernate Session中的Transaction API。

sessionFactory.getCurrentSession()是干什么的呢?首先,只要你持有SessionFactory(幸虧我們有HibernateUtil,可以隨時獲得),大可在任何時候、任何地點調用這個方法。getCurrentSession()方法總會返回“當前的”工作單元。記得我們在hibernate.cfg.xml中把這一配置選項調整為"thread"了嗎?因此,因此,當前工作單元被綁定到當前執行我們應用程序的Java線程。但是,這并非是完全準確的,你還得考慮工作單元的生命周期范圍 (scope),它何時開始,又何時結束.

Session在第一次被使用的時候,即第一次調用getCurrentSession()的時候,其生命周期就開始。然后它被Hibernate綁定到當前線程。當事務結束的時候,不管是提交還是回滾,Hibernate會自動把Session從當前線程剝離,并且關閉它。假若你再次調用getCurrentSession(),你會得到一個新的Session,并且開始一個新的工作單元。這種線程綁定(thread-bound)的編程模型(model)是使用Hibernate的最廣泛的方式,因為它支持對你的代碼靈活分層(事務劃分可以和你的數據訪問代碼分離開來,在本教程的后面部分就會這么做)。

和工作單元的生命周期這個話題相關,Hibernate Session是否被應該用來執行多次數據庫操作?上面的例子對每一次操作使用了一個Session,這完全是巧合,這個例子不是很復雜,無法展示其他方式。Hibernate Session的生命周期可以很靈活,但是你絕不要把你的應用程序設計成為每一次數據庫操作都用一個新的Hibernate Session。因此就算下面的例子(它們都很簡單)中你可以看到這種用法,記住每次操作一個session是一個反模式。在本教程的后面會展示一個真正的(web)程序。

關于事務處理及事務邊界界定的詳細信息,請參看第 11 章 事務和并發。在上面的例子中,我們也忽略了所有的錯誤與回滾的處理。

為第一次運行我們的程序,我們得在Ant的build文件中增加一個可以調用得到的target。

  1. <target name="run" depends="compile"> 
  2.     <java fork="true" classname="events.EventManager" classpathref="libraries"> 
  3.         <classpath path="${targetdir}"/> 
  4.         <arg value="${action}"/> 
  5.     java> 
  6. target> 

action參數(argument)的值是通過命令行調用這個target的時候設置的:

  1. C:\hibernateTutorial\>ant run -Daction=store 

你應該會看到,編譯以后,Hibernate根據你的配置啟動,并產生一大堆的輸出日志。在日志最后你會看到下面這行:

  1. [java] Hibernate: insert into EVENTS (EVENT_DATE, title, EVENT_ID) values (?, ?, ?) 

這是Hibernate執行的INSERT命令,問號代表JDBC的綁定參數。如果想要看到綁定參數的值或者減少日志的長度,就要調整你在log4j.properties文件里的設置。

我們想要列出所有已經被存儲的events,就要增加一個條件分支選項到main方法中去。

  1. if (args[0].equals("store")) {  
  2.     mgr.createAndStoreEvent("My Event", new Date());  
  3. }  
  4. else if (args[0].equals("list")) {  
  5.     List events = mgr.listEvents();  
  6.     for (int i = 0; i < events.size(); i++) {  
  7.         Event theEvent = (Event) events.get(i);  
  8.         System.out.println("Event: " + theEvent.getTitle() +  
  9.                            " Time: " + theEvent.getDate());  
  10.     }  

我們也增加一個新的listEvents()方法:

  1. private List listEvents() {  
  2.  
  3.     Session session = HibernateUtil.getSessionFactory().getCurrentSession();  
  4.  
  5.     session.beginTransaction();  
  6.  
  7.     List result = session.createQuery("from Event").list();  
  8.  
  9.     session.getTransaction().commit();  
  10.  
  11.     return result;  

我們在這里是用一個HQL(Hibernate Query Language-Hibernate查詢語言)查詢語句來從數據庫中加載所有存在的Event對象。Hibernate會生成適當的SQL,把它發送到數據庫,并操作從查詢得到數據的Event對象。當然,你可以使用HQL來創建更加復雜的查詢。

現在,根據以下步驟來執行并測試以上各項:

◆運行ant run -Daction=store來保存一些內容到數據庫。當然,先得用hbm2ddl來生成數據庫schema。

◆現在把hibernate.cfg.xml文件中hbm2ddl屬性注釋掉,這樣我們就取消了在啟動時用hbm2ddl來生成數據庫schema。通常只有在不斷重復進行單元測試的時候才需要打開它,但再次運行hbm2ddl會把你保存的一切都刪掉(drop)——create配置的真實含義是:“在創建SessionFactory的時候,從schema 中drop 掉所有的表,再重新創建它們”。

◆如果你現在使用命令行參數-Daction=list運行Ant,你會看到那些至今為止我們所儲存的events。當然,你也可以多調用幾次store以保存更多的envents。

注意:

很多Hibernate新手在這一步會失敗,我們不時看到關于Table not found錯誤信息的提問。但是,只要你根據上面描述的步驟來執行,就不會有這個問題,因為hbm2ddl會在第一次運行的時候創建數據庫schema,后繼的應用程序重起后還能繼續使用這個schema。假若你修改了映射,或者修改了數據庫schema,你必須把hbm2ddl重新打開一次。

看過本文我想大家對Hibernate加載并存儲對象應該有了更深入的了解,以后就可以靈活運用了。

【編輯推薦】

  1. Hibernate中Criteria攻略詳解
  2. 簡述Hibernate三種查詢的應用
  3. 談談Hibernate為何是Java開源項目
  4. 淺析為何學習Hibernate
  5. 淺析Hibernate VO與PO區別
責任編輯:仲衡 來源: TechTarget
相關推薦

2009-06-29 18:21:29

Hibernate

2009-09-29 16:41:58

Hibernate S

2009-09-28 09:35:10

Hibernate實現實體對象延遲加載

2009-09-23 09:16:25

Hibernate復合

2009-09-25 12:31:13

Hibernate映射

2009-09-28 13:45:59

Hibernate歷史

2009-09-29 17:22:30

Hibernate S

2009-09-24 10:35:10

Hibernate查詢

2009-09-29 10:37:29

Hibernate持久

2009-09-29 15:58:22

Hibernate映射

2011-03-24 11:37:41

Hibernate

2009-09-28 11:12:52

Hibernate O

2009-09-24 10:15:37

Hibernate查詢

2009-09-22 16:04:50

Hibernate連接

2009-09-24 11:41:46

Hibernate延遲

2009-06-17 11:18:02

Hibernate延遲

2009-09-29 09:44:52

Hibernate事務

2012-02-08 14:24:35

HibernateJava

2009-09-25 16:57:49

Hibernate查詢

2009-09-25 14:04:09

Hibernate eHibernate h
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美一区二区精品久导航 | 日韩久草| 日本精品久久 | 91精品国产综合久久久久久 | 欧美a在线看 | 免费久| 超碰操| 欧美国产日韩在线观看 | 成人av资源在线 | 亚洲精品福利在线 | 国产精品久久久久久久久久久久冷 | 日韩一区二区在线观看视频 | 亚洲免费久久久 | 国内av在线 | 成人免费在线播放视频 | 91在线精品播放 | 国产一区二区不卡 | av手机在线看 | 国产片侵犯亲女视频播放 | 欧美久久影院 | 亚洲国产成人精品女人久久久野战 | 中文字幕视频一区二区 | 亚洲一区二区三区国产 | 日日精品| 亚洲精品国产精品国自产在线 | 人人鲁人人莫人人爱精品 | 国产精品中文字幕在线播放 | 日本视频在线播放 | 毛片区 | 国产免费视频 | 亚洲精品一级 | 欧美综合久久久 | 亚洲最大成人综合 | 四虎影音 | 9191成人精品久久 | 一区二区三区四区在线免费观看 | 免费久久精品视频 | 久久大陆 | 久久大陆 | 欧美激情久久久 | 日韩欧美在 |