<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 1.3.3\. 使關聯工作 我們把一些people和events 一起放到`EventManager`的新方法中: ``` private void addPersonToEvent(Long personId, Long eventId) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Person aPerson = (Person) session.load(Person.class, personId); Event anEvent = (Event) session.load(Event.class, eventId); aPerson.getEvents().add(anEvent); session.getTransaction().commit(); } ``` 在加載一`Person`和`Event`后,使用普通的集合方法就可容易地修改我們定義的集合。如你所見,沒有顯式的`update()`或`save()`,Hibernate會自動檢測到集合已經被修改并需要更新回數據庫。這叫做自動臟檢查(_automatic dirty checking_),你也可以嘗試修改任何對象的name或者date屬性,只要他們處于_持久化_狀態,也就是被綁定到某個Hibernate 的`Session`上(如:他們剛剛在一個單元操作被加載或者保存),Hibernate監視任何改變并在后臺隱式寫的方式執行SQL。同步內存狀態和數據庫的過程,通常只在單元操作結束的時候發生,稱此過程為清理緩存_(flushing)_。在我們的代碼中,工作單元由數據庫事務的提交(或者回滾)來結束——這是由`CurrentSessionContext`類的`thread`配置選項定義的。 當然,你也可以在不同的單元操作里面加載person和event。或在`Session`以外修改不是處在持久化(persistent)狀態下的對象(如果該對象以前曾經被持久化,那么我們稱這個狀態為_脫管(detached)_)。你甚至可以在一個集合被脫管時修改它: ``` private void addPersonToEvent(Long personId, Long eventId) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Person aPerson = (Person) session .createQuery("select p from Person p left join fetch p.events where p.id = :pid") .setParameter("pid", personId) .uniqueResult(); // Eager fetch the collection so we can use it detached Event anEvent = (Event) session.load(Event.class, eventId); session.getTransaction().commit(); // End of first unit of work aPerson.getEvents().add(anEvent); // aPerson (and its collection) is detached // Begin second unit of work Session session2 = HibernateUtil.getSessionFactory().getCurrentSession(); session2.beginTransaction(); session2.update(aPerson); // Reattachment of aPerson session2.getTransaction().commit(); } ``` 對`update`的調用使一個脫管對象重新持久化,你可以說它被綁定到一個新的單元操作上,所以在脫管狀態下對它所做的任何修改都會被保存到數據庫里。這也包括你對這個實體對象的集合所作的任何改動(增加/刪除)。 這對我們當前的情形不是很有用,但它是非常重要的概念,你可以把它融入到你自己的應用程序設計中。在`EventManager`的main方法中添加一個新的動作,并從命令行運行它來完成我們所做的練習。如果你需要person及event的標識符 — 那就用`save()`方法返回它(你可能需要修改前面的一些方法來返回那個標識符): ``` else if (args[0].equals("addpersontoevent")) { Long eventId = mgr.createAndStoreEvent("My Event", new Date()); Long personId = mgr.createAndStorePerson("Foo", "Bar"); mgr.addPersonToEvent(personId, eventId); System.out.println("Added person " + personId + " to event " + eventId); } ``` 上面是個關于兩個同等重要的實體類間關聯的例子。像前面所提到的那樣,在特定的模型中也存在其它的類和類型,這些類和類型通常是“次要的”。你已看到過其中的一些,像`int`或`String`。我們稱這些類為_值類型(value type)_,它們的實例_依賴(depend)_在某個特定的實體上。這些類型的實例沒有它們自己的標識(identity),也不能在實體間被共享(比如,兩個person不能引用同一個`firstname`對象,即使他們有相同的first name)。當然,值類型并不僅僅在JDK中存在(事實上,在一個Hibernate應用程序中,所有的JDK類都被視為值類型),而且你也可以編寫你自己的依賴類,例如`Address`,`MonetaryAmount`。 你也可以設計一個值類型的集合,這在概念上與引用其它實體的集合有很大的不同,但是在Java里面看起來幾乎是一樣的。
                  <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>

                              哎呀哎呀视频在线观看