eric-1001c

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            3 隨筆 :: 45 文章 :: 12 評論 :: 0 Trackbacks

          <p>1)與Java對象在JVM中的生命周期類似,Java對象在Hibernate的session中也有生命周期類似的狀態(tài)。在Hibernate的session中,對象有3種狀態(tài):臨時狀態(tài),持久化狀態(tài),游離狀態(tài)。<br />
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a. 臨時狀態(tài)(transient),剛new出來的對象,還沒有被session持久化,不處于session的緩存中<br />
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.持久化狀態(tài)(persistent),已經(jīng)被持久化(在數(shù)據(jù)庫中有相應(yīng)的記錄),并且存在于session的緩存中<br />
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c. 游離狀態(tài)(detached),已經(jīng)被持久化(在數(shù)據(jù)庫中可能存在也可能不存在相應(yīng)的記錄),不存在于session的緩存中<br />
          <br />
          簡單的用個例子描述一下:<br />
          </p>
          <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img alt="" src="/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000"><img alt="" src="http://www.aygfsteel.com/Images/dot.gif" /><br />
          </span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="/Images/OutliningIndicators/None.gif" align="top" />tx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.beginTransaction();<br />
          </span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="/Images/OutliningIndicators/None.gif" align="top" />Customer&nbsp;c1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Customer(</span><span style="color: #000000">"</span><span style="color: #000000">Tom</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashSet());&nbsp;&nbsp;&nbsp; //c1 處于臨時狀態(tài)<br />
          </span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="/Images/OutliningIndicators/None.gif" align="top" />session.save(c1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//c1轉(zhuǎn)換為持久化狀態(tài)<br />
          </span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="/Images/OutliningIndicators/None.gif" align="top" />Long&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;c1.getId();<br />
          </span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="/Images/OutliningIndicators/None.gif" align="top" />c1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
          </span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="/Images/OutliningIndicators/None.gif" align="top" />Customer&nbsp;c2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Customer)session.load(Customer.</span><span style="color: #0000ff">class</span><span style="color: #000000">,id);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//c2 處于持久化狀態(tài)<br />
          </span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="/Images/OutliningIndicators/None.gif" align="top" />tx.commit();<br />
          </span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="/Images/OutliningIndicators/None.gif" align="top" />session.close();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//c1轉(zhuǎn)換為游離狀態(tài) <br />
          </span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="/Images/OutliningIndicators/None.gif" align="top" />c2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //c2轉(zhuǎn)換為游離狀態(tài)</span></div>
          <br />
          <br />
          <br />
          2)對象的狀態(tài)轉(zhuǎn)換<br />
          <img height="277" alt="" src="/images/blogjava_net/ericzhang5231/StateTransform.jpg" width="398" border="0" /><br />
          <br />
          <table style="width: 1000px; height: 195px" cellspacing="2" cellpadding="2" width="1000" border="0">
              <tbody>
                  <tr>
                      <td>狀態(tài)名稱</td>
                      <td>狀態(tài)特征</td>
                      <td>進入條件</td>
                      <td>備注</td>
                  </tr>
                  <tr>
                      <td>臨時對象</td>
                      <td>
                      <p>1.不存在任何一個session;</p>
                      <p>2.在數(shù)據(jù)庫沒有相應(yīng)的記錄;</p>
                      </td>
                      <td>
                      <p>1. 通過new;</p>
                      <p>2.Session通過delete()把持久化對象和游離對象轉(zhuǎn)化為臨時對象</p>
                      </td>
                      <td></td>
                  </tr>
                  <tr>
                      <td>持久化對象</td>
                      <td>
                      <p>1.總是被一個Session對象關(guān)聯(lián);</p>
                      <p>2.在數(shù)據(jù)庫有相應(yīng)的記錄;<br />
                      3.session清理緩存的時候,會根據(jù)持久化對象的屬性變化(其實根據(jù)快照),來同步更新數(shù)據(jù)庫</p>
                      </td>
                      <td>
                      <p>1.session的save()把臨時對象轉(zhuǎn)化持久化對象;<br />
                      2.session的load()或get()返回的對象;<br />
                      3.session的find()返回的對象;<br />
                      4.session的update(),saveOrUpdate()和lock()使游離對象轉(zhuǎn)變?yōu)槌志没瘜ο螅?lt;br />
                      5.當(dāng)一個持久化對象關(guān)聯(lián)一個臨時對象,當(dāng)允許級聯(lián)保存的情況下,臨時對象也轉(zhuǎn)化為持久化對象;</p>
                      <p>&nbsp;</p>
                      </td>
                      <td>1.避免多個session實例關(guān)聯(lián)一個Java對象</td>
                  </tr>
                  <tr>
                      <td>游離對象&nbsp;</td>
                      <td>
                      <p>1.不被session關(guān)聯(lián);</p>
                      <p>2.游離對象是由持久化對象轉(zhuǎn)化過來的,數(shù)據(jù)庫中可能存在也可能不存在相應(yīng)的記錄;</p>
                      </td>
                      <td>
                      <p>1.session的close(),把緩存中的所有持久化對象都轉(zhuǎn)變?yōu)橛坞x對象;</p>
                      <p>2.session的evict(),把緩存中的一個持久化對象刪除,使它變成游離狀態(tài);</p>
                      </td>
                      <td>1.游離對象和臨時對象的區(qū)別在于數(shù)據(jù)庫是否存在相應(yīng)的記錄</td>
                  </tr>
              </tbody>
          </table>
          <br />
          <br />
          <br />
          3)Session的緩存以及API<br />
          &nbsp;&nbsp;&nbsp;&nbsp;1.Session:在Session接口的實現(xiàn)類SessionImpl中定義了一系列的Java集合,這些集合構(gòu)成了Sessiond緩存<br />
          &nbsp;&nbsp;&nbsp;&nbsp;2.API:<br />
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
          <table style="width: 1005px; height: 270px" cellspacing="2" cellpadding="2" width="1005" border="0">
              <tbody>
                  <tr>
                      <td>save()</td>
                      <td>
                      <p>1.在save一個臨時對象之前,設(shè)置對象的主鍵ID,沒效果;</p>
                      <p>2.在save一個對象之后,對象主鍵ID不能修改,否則拋異常;<br />
                      3.如果主鍵ID是用nactive方式生成的,一旦調(diào)用session的save方法,hibernate會立即向數(shù)據(jù)庫插入數(shù)據(jù);<br />
                      4.save用來持久化一個臨時對象,若持久一個持久化對象,沒效果,若持久一個游離對象,會重新插入數(shù)據(jù);</p>
                      </td>
                  </tr>
                  <tr>
                      <td>update()</td>
                      <td>
                      <p>1.session清理緩存的時候,才會去執(zhí)行update()產(chǎn)生的sql語句,因此即使程序多次修改對象屬性,最后只會更新最后的修改;</p>
                      <p>2.通過update()使一個游離對象被一個session關(guān)聯(lián),即使沒有修改對象屬性,在清理緩存的時候也會執(zhí)行update()產(chǎn)生sql語句<br />
                      (如果希望僅當(dāng)修改對象屬性才進行update,可在&lt;class&gt;元素的select-before-update設(shè)置為true);<br />
                      3.當(dāng)update()方法關(guān)聯(lián)一個游離對象,如果session中存在相同OID的持久化對象,會拋出異常;<br />
                      4.當(dāng)update()方法關(guān)聯(lián)一個游離對象,如果數(shù)據(jù)庫中不存在相應(yīng)記錄,會拋出異常;</p>
                      </td>
                  </tr>
                  <tr>
                      <td>saveOrUpdate()</td>
                      <td>
                      <p>1.如果傳入的是臨時對象,調(diào)用save(); 如果傳入的是持久化對象,調(diào)用update();</p>
                      </td>
                  </tr>
                  <tr>
                      <td>load(), get()</td>
                      <td>1.兩者都是根據(jù)OID從數(shù)據(jù)庫中加載持久化對象,區(qū)別是:當(dāng)數(shù)據(jù)庫不存在與OID對應(yīng)的記錄,load()會拋出net.sf.hibernate.ObjectNotFoundException,而get()方法返回null;</td>
                  </tr>
                  <tr>
                      <td>delete()</td>
                      <td>1.對傳入的是持久化對象,session就按照預(yù)先的sql語句刪除一個記錄;如果是一個游離態(tài)對象,會把它關(guān)聯(lián)到session,在按照sql語句刪除記錄</td>
                  </tr>
              </tbody>
          </table>
          <br />
          &nbsp;&nbsp;&nbsp;&nbsp;3.session的級聯(lián):因為對象是相互關(guān)聯(lián),因此在session存放的是一副相互關(guān)聯(lián)的對象圖。在對象-關(guān)聯(lián)映射文件中,用于映射持久化類之間關(guān)聯(lián)的元素,如&lt;set&gt;,&lt;many-to-one&gt;,&lt;one-to-many&gt;,都有一個cascade屬性。casecade屬性值如下:<br />
          <table cellspacing="2" cellpadding="2" width="500" border="0">
              <tbody>
                  <tr>
                      <td>屬性值</td>
                      <td>描述</td>
                  </tr>
                  <tr>
                      <td>none</td>
                      <td>默認(rèn)值,忽略關(guān)聯(lián)對象</td>
                  </tr>
                  <tr>
                      <td>save-update</td>
                      <td>session對當(dāng)前對象調(diào)用save(),update(),saveOrUpdate(),級聯(lián)保存關(guān)聯(lián)的臨時對象,級聯(lián)更新關(guān)聯(lián)的游離對象</td>
                  </tr>
                  <tr>
                      <td>delete</td>
                      <td>級聯(lián)刪除所有關(guān)聯(lián)的對象</td>
                  </tr>
                  <tr>
                      <td>all</td>
                      <td>包含save-update(),delelte()行為;當(dāng)對當(dāng)前對象執(zhí)行evict()或lock(),級聯(lián)執(zhí)行關(guān)聯(lián)的對象</td>
                  </tr>
                  <tr>
                      <td>delete-orphan</td>
                      <td>刪除所有和當(dāng)前對象解除關(guān)聯(lián)關(guān)系的對象</td>
                  </tr>
                  <tr>
                      <td>all-delete-orphan</td>
                      <td>包含all和delete-orphan的行為</td>
                  </tr>
              </tbody>
          </table>
          posted on 2008-01-21 21:25 Eric-1001c 閱讀(284) 評論(0)  編輯  收藏 所屬分類: Hibernate
          主站蜘蛛池模板: 泰州市| 车险| 扬州市| 习水县| 扬中市| 霍林郭勒市| 达孜县| 鲜城| 汤原县| 南丰县| 垫江县| 东兰县| 杨浦区| 冕宁县| 丰城市| 大兴区| 白山市| 北辰区| 安平县| 茶陵县| 美姑县| 平武县| 尉氏县| 盱眙县| 屏山县| 泾阳县| 九台市| 府谷县| 东阳市| 青龙| 罗定市| 昭觉县| 新和县| 上高县| 遵义市| 榆林市| 赤壁市| 墨江| 乌鲁木齐县| 永川市| 闵行区|