<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 1.2.6\. 加載并存儲對象 我們終于可以使用Hibernate來加載和存儲對象了,編寫一個帶有`main()`方法的`EventManager`類: ``` package events; import org.hibernate.Session; import java.util.Date; import util.HibernateUtil; public class EventManager { public static void main(String[] args) { EventManager mgr = new EventManager(); if (args[0].equals("store")) { mgr.createAndStoreEvent("My Event", new Date()); } HibernateUtil.getSessionFactory().close(); } private void createAndStoreEvent(String title, Date theDate) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Event theEvent = new Event(); theEvent.setTitle(title); theEvent.setDate(theDate); session.save(theEvent); session.getTransaction().commit(); } } ``` 我們創建了個新的`Event`對象并把它傳遞給Hibernate。現在Hibernate負責與SQL打交道,并把`INSERT`命令傳給數據庫。在運行之前,讓我們看一下處理`Session`和`Transaction`的代碼。 一個`Session`就是個單一的工作單元。我們暫時讓事情簡單一些,并假設Hibernate`Session`和數據庫事務是一一對應的。為了讓我們的代碼從底層的事務系統中脫離出來(此例中是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 章 _事務和并發_](../Text/pr01_split_000.html "第 11 章 事務和并發")。在上面的例子中,我們也忽略了所有的錯誤與回滾的處理。 為第一次運行我們的程序,我們得在Ant的build文件中增加一個可以調用得到的target。 ``` <target name="run" depends="compile"> <java fork="true" classname="events.EventManager" classpathref="libraries"> <classpath path="${targetdir}"/> <arg value="${action}"/> </java> </target> ``` `action`參數(argument)的值是通過命令行調用這個target的時候設置的: ``` C:\hibernateTutorial\>ant run -Daction=store ``` 你應該會看到,編譯以后,Hibernate根據你的配置啟動,并產生一大堆的輸出日志。在日志最后你會看到下面這行: ``` [java] Hibernate: insert into EVENTS (EVENT_DATE, title, EVENT_ID) values (?, ?, ?) ``` 這是Hibernate執行的`INSERT`命令,問號代表JDBC的綁定參數。如果想要看到綁定參數的值或者減少日志的長度,就要調整你在`log4j.properties`文件里的設置。 我們想要列出所有已經被存儲的events,就要增加一個條件分支選項到main方法中去。 ``` if (args[0].equals("store")) { mgr.createAndStoreEvent("My Event", new Date()); } else if (args[0].equals("list")) { List events = mgr.listEvents(); for (int i = 0; i < events.size(); i++) { Event theEvent = (Event) events.get(i); System.out.println("Event: " + theEvent.getTitle() + " Time: " + theEvent.getDate()); } } ``` 我們也增加一個新的`listEvents()`方法: ``` private List listEvents() { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); List result = session.createQuery("from Event").list(); session.getTransaction().commit(); 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重新打開一次。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看