1、對(duì)象關(guān)系映射
1-1、單向多對(duì)一關(guān)聯(lián)
產(chǎn)品和分類的關(guān)系:多個(gè)不同產(chǎn)品屬于同一種分類。
private Category category;
<many-to-one name="category" column="categoryId" not-null="true" />
1-2、一對(duì)多映射
private Set products = new HashSet();
<set name="products" <!--Category 中集合屬性名稱為 products-->
table="product" <!--集合屬性對(duì)應(yīng)表的名稱為 product-->
schema="test" <!--表的 schema 名稱為 test-->
lazy="true" <!--此集合采用延時(shí)加載策略-->
inverse="true" <!--由關(guān)聯(lián)屬性的另一方作為關(guān)聯(lián)的主控方-->
cascade="delete" <!--采用級(jí)聯(lián)刪除,當(dāng) Category 被刪除時(shí)關(guān)聯(lián)的此集合內(nèi)容也將被刪除-->
sort="natural" <!--自然排序集合內(nèi)容-->
order-by="productId asc" <!--按 productId 字段升序排列集合內(nèi)容-->
>
<key column="category_fk" />
<one-to-many class="petstore.domain.Product" />
</set>
1-3、繼承映射
2、Hibernate 操作對(duì)象
2-1、對(duì)象的三種狀態(tài)
● 瞬時(shí)態(tài)(Transient)--VO(Value Ojbect)
對(duì)象實(shí)例產(chǎn)生到被 JVM 垃圾回收為止并不受 Hibernate 框架管理。
● 持久態(tài)(Persistent)--PO(Persistent Ojbect)
對(duì)象實(shí)例被 Hibernate 框架管理,該對(duì)象可能是剛被保存的,或剛從數(shù)據(jù)庫(kù)中被加載的。Hibernate 會(huì)檢測(cè)處于持久態(tài)的對(duì)象任何改動(dòng),在當(dāng)前操作單元執(zhí)行完畢將對(duì)象與數(shù)據(jù)庫(kù)同步,即將對(duì)象的屬性保存到數(shù)據(jù)庫(kù)映射對(duì)應(yīng)的字段中。簡(jiǎn)單點(diǎn)說(shuō)就是該實(shí)體對(duì)象與 session 發(fā)生關(guān)系,而且處于 session 的有效期內(nèi)。
● 托管態(tài)(Detached)--VO(Value Ojbect)
與持久對(duì)象關(guān)聯(lián)的 Session 被關(guān)閉后,對(duì)象就變?yōu)橥泄艿?,可繼續(xù)被修改。托管對(duì)象如果重新關(guān)聯(lián)到某個(gè)新的 Session 上,會(huì)再次變?yōu)槌志玫模瑫r(shí)改動(dòng)也將會(huì)被持久化到數(shù)據(jù)庫(kù)。這個(gè)期間的轉(zhuǎn)變過(guò)程可以看作是應(yīng)用程序事務(wù),即中間會(huì)給用戶思考時(shí)間的長(zhǎng)時(shí)間運(yùn)行的操作單元。
處于托管態(tài)對(duì)象具有與數(shù)據(jù)庫(kù)表記錄間的聯(lián)系(持久化標(biāo)識(shí),identifier)。
2-2、對(duì)象操作的應(yīng)用程序接口
● 修改對(duì)象
對(duì)于已經(jīng)持久化的對(duì)象,不需要調(diào)用某個(gè)特定的方法就可以實(shí)現(xiàn)修改持久化,因?yàn)?Hibernate 會(huì)自動(dòng)調(diào)用 flush() 方法保證與數(shù)據(jù)庫(kù)的同步。
對(duì)于處于托管狀態(tài)的實(shí)例,Hibernate 通過(guò)提供 Session.update() 或 Session.merge() 方法,重新關(guān)聯(lián)托管實(shí)例。但是需要注意的是:如果具有持久化標(biāo)識(shí)(identifier)的對(duì)象之前已經(jīng)被另一個(gè)會(huì)話連接(secondSession)裝載了,應(yīng)用程序關(guān)聯(lián)操作會(huì)發(fā)生異常。
使用 merge() 方法時(shí),用戶不必考慮 session 的狀態(tài),可隨時(shí)將修改保存到數(shù)據(jù)庫(kù)中。例如:Session 中存在相同標(biāo)識(shí)的持久化實(shí)例時(shí),Hibernate 便會(huì)根據(jù)用戶給出的對(duì)象狀態(tài)覆蓋原有的持久化實(shí)例的狀態(tài)。
另外,Hibernate 還提供了 saveOrUpdate()方法,它即可分配新持久化標(biāo)識(shí)(identifier),保存瞬時(shí)(transient)對(duì)象,又可更新/重新關(guān)聯(lián)托管的(identifier)實(shí)例。
● 刪除對(duì)象
通過(guò) HQL 語(yǔ)句,調(diào)用重載的 delete(),可以一次刪除多個(gè)對(duì)象。
session.delete("from Customer as c where c.customerId <3");
● 查詢對(duì)象
已知對(duì)象表示符值查詢
對(duì)象標(biāo)識(shí)符未知查詢 HQL
根據(jù)某些特定條件查詢 QBC,Query By Criteria
按詳例查詢 QBE,Query By Example
調(diào)用數(shù)據(jù)庫(kù)查詢 native SQL
查詢條件參數(shù) ? 查詢條件參數(shù)索引,由 0 開始。
查詢條件實(shí)名 :name
外置命名查詢
在映射文件定義查詢語(yǔ)句,將程序與查詢語(yǔ)句分離:
<query name="CategoryById"
<! [CDATA[
from Category c where c.categoryId>? ]]>
</query>
程序調(diào)用:
Query q = sess.getNamedQuery("CategoryById");
q.setLong(0, name);
List cats = q.List();
用 Query 提供的 iterate() 方法遍歷查詢結(jié)果,如果查詢的結(jié)果在 session 或二級(jí)緩存(second-level cache)中,那么使用 iterate() 方法可以得到更好的性能。
如果 JDBC 驅(qū)動(dòng)支持可滾動(dòng)的 ResuleSet,Query 接口可以使用 ScrollableResults,允許你在查詢結(jié)果中靈活移動(dòng)(需要保持?jǐn)?shù)據(jù)庫(kù)連接和游標(biāo) cursor 處于抑制打開狀態(tài))。
ScrollableResults cates = q.scroll();
cates.first()
cates.scroll(5);
● cascade 和 inverse 級(jí)聯(lián)操作
inverse
只對(duì) set,one-to-many(或 many-to-many)有效,對(duì)于 many-to-one,one-to-one 無(wú)效
對(duì)集合起整體作用
cascade
對(duì)關(guān)系標(biāo)記都有效
對(duì)集合的一個(gè)元素起作用,如果集合為空,那么 cascade 不會(huì)引發(fā)關(guān)聯(lián)操作
作用時(shí)機(jī):在 flush 時(shí)(commit 會(huì)自動(dòng)執(zhí)行 flush),hibernate 會(huì)自行判斷每個(gè) set 是否有變化,對(duì)有變化的 set 執(zhí)行相應(yīng)的 SQL,if (inverse) return。即:cascade 在前,inverse 在后。
異常:
org.hibernate.exception.ConstraintViolationException: could not insert
原因是 category_fk 字段約束不能為空,而在新建的 Product 對(duì)象時(shí)插入了空值,而且關(guān)聯(lián)關(guān)系由 Caterogy 對(duì)象維持,而被關(guān)聯(lián)的 Product 對(duì)象不知道自己與哪個(gè) Category 對(duì)象關(guān)聯(lián)。說(shuō)到底就是 pro 對(duì)象的 categoryId 值為空。
posted on 2009-04-11 20:46
黃小二 閱讀(430)
評(píng)論(0) 編輯 收藏 所屬分類:
S/S2SH 、
J2EE 、
J2SE