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