對(duì)hibernate的新認(rèn)識(shí)
最近項(xiàng)目接觸的新架構(gòu)讓我對(duì)Spring和Hibernate又有了新的認(rèn)識(shí),以前使用Hibernate的時(shí)候并不是從真正的ORM角度來考慮的,我想ORM真正的目的是讓我們不需要去關(guān)注數(shù)據(jù)庫表與表之間的關(guān)系,而是考慮Entity對(duì)象之間的關(guān)系,將關(guān)注點(diǎn)從表與表之間轉(zhuǎn)移到對(duì)象與對(duì)象的關(guān)系上。
以前在使用hibernate的時(shí)候,經(jīng)常由middlegen或其他工具生成Entity類后就不再改動(dòng),或者只對(duì)一些字段屬性進(jìn)行改動(dòng),而現(xiàn)在這個(gè)架構(gòu)在使用的時(shí)候,所有的entity之間的業(yè)務(wù)邏輯都是實(shí)現(xiàn)在entity類里面,如有Account, User, Balance這三個(gè)實(shí)體類,一個(gè)User可能有多個(gè)Account, 一個(gè)Account的對(duì)應(yīng)一個(gè)Balance,如果需要添加一個(gè)新的User,同時(shí)再創(chuàng)建一個(gè)默認(rèn)的Account, 這樣的邏輯我以前會(huì)把他們都在Service層中實(shí)現(xiàn),而現(xiàn)在的做法是直接在User類中設(shè)置一個(gè)addAccount的方法,在createUser的時(shí)候進(jìn)行調(diào)用,而創(chuàng)建User時(shí)則是調(diào)用一個(gè)Factory進(jìn)行創(chuàng)建。這樣就將業(yè)務(wù)邏輯全部封裝在entity類中,除了一些查詢之外,而這寫對(duì)象也就成了domain對(duì)象。
當(dāng)然,在客戶端調(diào)用的時(shí)候我們還是通過一個(gè)Service來調(diào)用domain對(duì)象的,這個(gè)Service是由Spring維護(hù)的,在每個(gè)service方法中都會(huì)存在Hibernate的Session,這樣在持久化的時(shí)候,只需要flush一下就可以將所有的domain對(duì)象持久化到數(shù)據(jù)庫中。在當(dāng)前框架中,表現(xiàn)層使用的是GWT,而hibernate session則使用Spring的SessionInViewInterceptor將session一直傳播到表現(xiàn)層,這樣在Lazyload的時(shí)候就不會(huì)出現(xiàn)問題。所有domain對(duì)象的ID都是由AspectJ靜態(tài)織入,因?yàn)樵谑褂玫臅r(shí)候,要避免對(duì)ID進(jìn)行操作,如根據(jù)ID進(jìn)行查找之類的,因?yàn)镮D都是無業(yè)務(wù)的主鍵。
在hibernate mapping file中,所有實(shí)體的關(guān)系都體現(xiàn)在里面,包括subclass, map,list之類的數(shù)據(jù)結(jié)構(gòu),這些結(jié)構(gòu)之前我很少用到,看來對(duì)hibernate的理解還是有些差異,僅僅局限在了簡(jiǎn)單的使用上,卻忘了其精髓----ORM,從對(duì)象的角度考慮
以前在使用hibernate的時(shí)候,經(jīng)常由middlegen或其他工具生成Entity類后就不再改動(dòng),或者只對(duì)一些字段屬性進(jìn)行改動(dòng),而現(xiàn)在這個(gè)架構(gòu)在使用的時(shí)候,所有的entity之間的業(yè)務(wù)邏輯都是實(shí)現(xiàn)在entity類里面,如有Account, User, Balance這三個(gè)實(shí)體類,一個(gè)User可能有多個(gè)Account, 一個(gè)Account的對(duì)應(yīng)一個(gè)Balance,如果需要添加一個(gè)新的User,同時(shí)再創(chuàng)建一個(gè)默認(rèn)的Account, 這樣的邏輯我以前會(huì)把他們都在Service層中實(shí)現(xiàn),而現(xiàn)在的做法是直接在User類中設(shè)置一個(gè)addAccount的方法,在createUser的時(shí)候進(jìn)行調(diào)用,而創(chuàng)建User時(shí)則是調(diào)用一個(gè)Factory進(jìn)行創(chuàng)建。這樣就將業(yè)務(wù)邏輯全部封裝在entity類中,除了一些查詢之外,而這寫對(duì)象也就成了domain對(duì)象。
當(dāng)然,在客戶端調(diào)用的時(shí)候我們還是通過一個(gè)Service來調(diào)用domain對(duì)象的,這個(gè)Service是由Spring維護(hù)的,在每個(gè)service方法中都會(huì)存在Hibernate的Session,這樣在持久化的時(shí)候,只需要flush一下就可以將所有的domain對(duì)象持久化到數(shù)據(jù)庫中。在當(dāng)前框架中,表現(xiàn)層使用的是GWT,而hibernate session則使用Spring的SessionInViewInterceptor將session一直傳播到表現(xiàn)層,這樣在Lazyload的時(shí)候就不會(huì)出現(xiàn)問題。所有domain對(duì)象的ID都是由AspectJ靜態(tài)織入,因?yàn)樵谑褂玫臅r(shí)候,要避免對(duì)ID進(jìn)行操作,如根據(jù)ID進(jìn)行查找之類的,因?yàn)镮D都是無業(yè)務(wù)的主鍵。
在hibernate mapping file中,所有實(shí)體的關(guān)系都體現(xiàn)在里面,包括subclass, map,list之類的數(shù)據(jù)結(jié)構(gòu),這些結(jié)構(gòu)之前我很少用到,看來對(duì)hibernate的理解還是有些差異,僅僅局限在了簡(jiǎn)單的使用上,卻忘了其精髓----ORM,從對(duì)象的角度考慮
posted on 2008-01-30 11:14 船夫 閱讀(1955) 評(píng)論(7) 編輯 收藏 所屬分類: java技術(shù)