【正文】
stent狀態(tài)。 ? hibernate對(duì) persistent對(duì)象提供與數(shù)據(jù)庫(kù)的同步支持和事務(wù)支持。 與數(shù)據(jù)庫(kù)的同步 ? 臟數(shù)據(jù):數(shù)據(jù)僅僅在內(nèi)存中更新而沒有同步到數(shù)據(jù)庫(kù)中稱為臟數(shù)據(jù)。 ? hibernate會(huì)監(jiān)測(cè)臟數(shù)據(jù),在盡可能遲的時(shí)候做同步的動(dòng)作。( transparent transactionlevel writebehind) ? hibernate可以做到僅僅更新有變動(dòng)的屬性,但是需要在映射文件中設(shè)置 dynamicupdate=“true”,默認(rèn)是 false。這個(gè)功能用手工很難完成。 Detached objects ? 當(dāng)調(diào)用 (),原先的 persistent object就轉(zhuǎn)化為 detached object。 ? detached object和數(shù)據(jù)庫(kù)失去了聯(lián)系,但是它們不是 transient object,它們具有datebase identity。 ? hibernate可以在新的事務(wù)中重新聯(lián)系detached object。這樣可以在多個(gè)層面中傳遞這些持久對(duì)象。對(duì)于多層架構(gòu)的設(shè)計(jì)產(chǎn)生重大影響。 例子 —— 1 例子 —— 2 例子 —— 3 對(duì)象的狀態(tài)圖 區(qū)分 transient and detached對(duì)象 ? Identifier屬性是否為 null ? 對(duì)于非對(duì)象類型的 Identifier,判斷 unsavedvalue的值 ? 優(yōu)先考慮使用對(duì)象類型的 Identifier,因?yàn)閷?duì)象可以為 null。 ? 該方法只對(duì) synthetic keys有效,對(duì)于assigned keys和 posite keys無(wú)效。 The scope of object identity ? no identity scope:數(shù)據(jù)的同一性沒有范圍,同一條記錄分別取兩次,返回的對(duì)象不滿足 a==b; ? transactionscoped identity:在同一個(gè)事務(wù)中,同一條記錄取兩次,滿足 a==b,在事務(wù)級(jí)別需要緩存; ? Processscoped identity:在同一個(gè)進(jìn)程中只有一個(gè)對(duì)象被返回,范圍達(dá)到整個(gè) JVM。 對(duì)象樹 ? 通常大型應(yīng)用中操作的不可能只有一個(gè)對(duì)象,而是一個(gè)對(duì)象圖。 Persistence by reachability ? pute被持久化時(shí),它所 reference的任何對(duì)象都被持久化,但是不包括“ Electronics” 和 “ Cell Phones”。 ? 這是一個(gè)遞歸的過(guò)程。 ? 在理想的環(huán)境中: root對(duì)象被加載,那么整個(gè)對(duì)象樹在任何時(shí)候都可以被重新建立。如果某一個(gè)對(duì)象是非 reachable的,那么就應(yīng)該成為 transient。 不可能的任務(wù) ? 數(shù)據(jù)庫(kù)沒有 root的概念,只有 foreign key。 ? Java有垃圾回收的算法,而數(shù)據(jù)庫(kù)沒有。 ? 如果數(shù)據(jù)庫(kù)要實(shí)現(xiàn)一個(gè)類似的,需要做全表掃描,那時(shí)不現(xiàn)實(shí)的。 ? 對(duì)象圖只是數(shù)據(jù)庫(kù)的一部份。 ? persistence by reachability只解決了一半問(wèn)題,如何完成 persistence transient。 解決之道 — Cascade ? none:默認(rèn)設(shè)置 ,hibernate不做級(jí)聯(lián)任何動(dòng)作。 ? saveupdate:如果 item被持久化,那么所有被item所 reference的 bid都應(yīng)該被持久化。 ? delete:如果 item被刪除,那么 item所 reference的 bid的被刪除。 ? all: = saveupdate + delete ? deleteorphan:如果 Item所屬的 Bid Set中的某個(gè)Bit被刪除 , 那么數(shù)據(jù)庫(kù)中 Bid也被刪除 . 目 錄 ? 持久層的概念及必要性 ? hibernate框架及核心類介紹 ? hibernate進(jìn)行持久化的一個(gè)例子 ? hibernate如何解決對(duì)象和模型的不匹配 ? 對(duì)象的持久性生命周期 ? 對(duì)目前項(xiàng)目的進(jìn)一步封裝和思考 重新思考項(xiàng)目之間的關(guān)系 e t o n g c o m m o ne t o n g w o r k f l o w e n g i n ee t o n g y a x i aetongmon的依賴關(guān)系 e t o n g c o m m o nh i b e r n a t e 2 . 1 . 8h t m l p a r s e rd o m 4 j 1 . 4c o m m o n s l a n g 2 . 0 . j a retongmon的內(nèi)部體系 u t i lh i b e r n a tp e r s i s t e n c eh t m lj u n i t持久包 — 通用的持久化類設(shè)計(jì) S e r v i c e F a c t o r yC o m m o n D a o+ m a k e P e r s i s t e n t ( )+ m a k e T r a n s i e n t ( ) 接 口 S e r v i c e P e r s i s t e n c eS e r v i c e P e r s i s t e n c e I m p l優(yōu)化設(shè)計(jì)后的代碼 ? User user = new User()。 (name)。 (password)。 ()。 ().makePersistent(user)。 沉重的反思 —— 事務(wù)腳本 d a o d o m a i ns e r v i c e粒度順序是: service dao domain 業(yè)務(wù)邏輯盡量寫在 domain里,不要在 service寫任何業(yè)務(wù)邏輯,而僅僅在 service里調(diào)用 dao和 domain,完成事務(wù)邏輯,供前臺(tái)調(diào)用。 參考書籍 ? Hibernate In Action——CHRISTIAN BAUER、 GAVIN KING ? Patterns of Enterprise Application Architecture (企業(yè)應(yīng)用架構(gòu)模式 )——Martin Fowle ? 深入淺出 Hibernate——夏昕、曹曉鋼