日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
簡(jiǎn)述Hibernate中加載并存儲(chǔ)對(duì)象

本文主要向大家介紹Hibernate加載并存儲(chǔ)對(duì)象,下面我們用一個(gè)例子來(lái)加以說(shuō)明。讓你更輕松的了解Hibernate中加載并存儲(chǔ)對(duì)象的好處。

專業(yè)領(lǐng)域包括網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)購(gòu)物商城網(wǎng)站建設(shè)、微信營(yíng)銷、系統(tǒng)平臺(tái)開發(fā), 與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開發(fā)公司不同,創(chuàng)新互聯(lián)建站的整合解決方案結(jié)合了幫做網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營(yíng)銷的理念,并將策略和執(zhí)行緊密結(jié)合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。

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

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

我們創(chuàng)建了個(gè)新的Event對(duì)象并把它傳遞給Hibernate?,F(xiàn)在Hibernate負(fù)責(zé)與SQL打交道,并把INSERT命令傳給數(shù)據(jù)庫(kù)。在運(yùn)行之前,讓我們看一下處理Session和Transaction的代碼。

一個(gè)Session就是個(gè)單一的工作單元。我們暫時(shí)讓事情簡(jiǎn)單一些,并假設(shè)HibernateSession和數(shù)據(jù)庫(kù)事務(wù)是一一對(duì)應(yīng)的。為了讓我們的代碼從底層的事務(wù)系統(tǒng)中脫離出來(lái)(此例中是JDBC,但也可能是JTA),我們使用Hibernate Session中的Transaction API。

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

Session在第一次被使用的時(shí)候,即第一次調(diào)用getCurrentSession()的時(shí)候,其生命周期就開始。然后它被Hibernate綁定到當(dāng)前線程。當(dāng)事務(wù)結(jié)束的時(shí)候,不管是提交還是回滾,Hibernate會(huì)自動(dòng)把Session從當(dāng)前線程剝離,并且關(guān)閉它。假若你再次調(diào)用getCurrentSession(),你會(huì)得到一個(gè)新的Session,并且開始一個(gè)新的工作單元。這種線程綁定(thread-bound)的編程模型(model)是使用Hibernate的最廣泛的方式,因?yàn)樗С謱?duì)你的代碼靈活分層(事務(wù)劃分可以和你的數(shù)據(jù)訪問(wèn)代碼分離開來(lái),在本教程的后面部分就會(huì)這么做)。

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

關(guān)于事務(wù)處理及事務(wù)邊界界定的詳細(xì)信息,請(qǐng)參看第 11 章 事務(wù)和并發(fā)。在上面的例子中,我們也忽略了所有的錯(cuò)誤與回滾的處理。

為第一次運(yùn)行我們的程序,我們得在Ant的build文件中增加一個(gè)可以調(diào)用得到的target。

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

action參數(shù)(argument)的值是通過(guò)命令行調(diào)用這個(gè)target的時(shí)候設(shè)置的:

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

你應(yīng)該會(huì)看到,編譯以后,Hibernate根據(jù)你的配置啟動(dòng),并產(chǎn)生一大堆的輸出日志。在日志最后你會(huì)看到下面這行:

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

這是Hibernate執(zhí)行的INSERT命令,問(wèn)號(hào)代表JDBC的綁定參數(shù)。如果想要看到綁定參數(shù)的值或者減少日志的長(zhǎng)度,就要調(diào)整你在log4j.properties文件里的設(shè)置。

我們想要列出所有已經(jīng)被存儲(chǔ)的events,就要增加一個(gè)條件分支選項(xiàng)到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.     }
  11. }

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

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

我們?cè)谶@里是用一個(gè)HQL(Hibernate Query Language-Hibernate查詢語(yǔ)言)查詢語(yǔ)句來(lái)從數(shù)據(jù)庫(kù)中加載所有存在的Event對(duì)象。Hibernate會(huì)生成適當(dāng)?shù)腟QL,把它發(fā)送到數(shù)據(jù)庫(kù),并操作從查詢得到數(shù)據(jù)的Event對(duì)象。當(dāng)然,你可以使用HQL來(lái)創(chuàng)建更加復(fù)雜的查詢。

現(xiàn)在,根據(jù)以下步驟來(lái)執(zhí)行并測(cè)試以上各項(xiàng):

◆運(yùn)行ant run -Daction=store來(lái)保存一些內(nèi)容到數(shù)據(jù)庫(kù)。當(dāng)然,先得用hbm2ddl來(lái)生成數(shù)據(jù)庫(kù)schema。

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

◆如果你現(xiàn)在使用命令行參數(shù)-Daction=list運(yùn)行Ant,你會(huì)看到那些至今為止我們所儲(chǔ)存的events。當(dāng)然,你也可以多調(diào)用幾次store以保存更多的envents。

注意:

很多Hibernate新手在這一步會(huì)失敗,我們不時(shí)看到關(guān)于Table not found錯(cuò)誤信息的提問(wèn)。但是,只要你根據(jù)上面描述的步驟來(lái)執(zhí)行,就不會(huì)有這個(gè)問(wèn)題,因?yàn)閔bm2ddl會(huì)在第一次運(yùn)行的時(shí)候創(chuàng)建數(shù)據(jù)庫(kù)schema,后繼的應(yīng)用程序重起后還能繼續(xù)使用這個(gè)schema。假若你修改了映射,或者修改了數(shù)據(jù)庫(kù)schema,你必須把hbm2ddl重新打開一次。

看過(guò)本文我想大家對(duì)Hibernate加載并存儲(chǔ)對(duì)象應(yīng)該有了更深入的了解,以后就可以靈活運(yùn)用了。


分享標(biāo)題:簡(jiǎn)述Hibernate中加載并存儲(chǔ)對(duì)象
分享路徑:http://m.5511xx.com/article/cdccddp.html