Tin's Blog

          You are coming a long way, baby~Thinking, feeling, memory...

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

          SpringSide是一個fantasy的好項目,可惜駑鈍,沒能加入其中,有時會看看它的代碼,吸取一些養(yǎng)分。
          http://www.springside.org.cn/

          今天先看看Springside的bookstore的domain設(shè)計,這不是springside的重點,先看看。
          從hbm看起,在springside-bookstore/src/org.springside.bookstore.commons.domain.hbm下面放著這些hbm。
          在Order.hbm.xml里面可以看到一個list映射。list映射可以按照順序持久化one-to-many關(guān)系。使用了<composite-element>映射后OrderItem就沒有單獨的class聲明了,完全以一種組件的形式被映射到Order里面。
          有序的List映射是很方便的,這樣就可以通過List的set(int, Object)來改變OrderItem的順序,這個需求是經(jīng)常被提起的。
          Order.java里面可以看到在價格計算上使用了Rule,Rule是用String紀(jì)錄的rule id,我記得springside團隊試驗性的使用了Drools,具體在進步研究后分析。
          Order實現(xiàn)了AclDomainAware接口,可見是用ACL進行了訪問控制。沒有繼承自統(tǒng)一的DomainObject基類,這個不知從何考慮,感覺Domain繼承自統(tǒng)一基類在框架很多地方都可以得到便利。實現(xiàn)接口在這里應(yīng)該作為一種簽名標(biāo)示,作為某些環(huán)節(jié)或者攔截器使用。SpringSide這里應(yīng)該是用的是Acegi,可以看到這個是差沙同學(xué)實現(xiàn)的。
          Order這部分就沒有什么其它特別之處了,是比較典型的pojo,貧血模型:D。在這里沒有看到全功能DomainModel的影子。此時修改Order里面的orderItems就需要手動替換,addProduct的功能都不在這里,的確有點不爽。
          BTW:在Order.hbm.xml的配置里面可以看到上面有一行<import class="org.springside.bookstore.commons.domain.OrderItem"/>,不知道起什么作用,希望了解的朋友指點。
          在Product.hbm.xml里面有一個繼承映射:“每個類分層結(jié)構(gòu)一張表(Table per class hierarchy)”的形式。
          再進到Product.java里面,它實現(xiàn)了HistorizableEntity接口,而前者又繼承自AuditableEntity。
          從里面的注釋上看HistorizableEntity作為Hibernate Event Listener的記號,對此接口的領(lǐng)域?qū)ο笞詣颖4嫘薷募o(jì)錄,這個我找到代碼在org.springside.core.commons.support.audit.HistoryEventListener里面。這個東西被配置到session上。從代碼上看,這個東西用來記錄這個商品的LifeCycle,不過代碼還沒有完成,不知道calvin同學(xué)會用什么方法得到user等信息(Hibernate Listener是單例,不能有狀態(tài)信息)。這種方法在RoR里面有個_at和_on的后綴,可以自動完成修改時間等信息的持久化,不知道此處是否是要實現(xiàn)類似的功能。
          Product里面有個@SearchableId、@SearchableProperty、@SearchableComponent的注釋,這是compass的注釋,這種暴露屬性提供搜索的配置方式非常舒服,是對pojo進行搜索的好例子。compass對Lucene的包裝是不錯的,這里好像是hellboys同學(xué)寫的,有時間深入看一下。
          限制描述字段的功能放到了pojo里面,這個方法很不錯,大家也都在用。
          Product的toString方法使用的是ToStringBuilder.reflectionToString,這個不知大家是否常用,不過這個東西大家要主要。比如在Domain公用基類中就不要用,否則它會對所有l(wèi)azy load的屬性有毀滅性打擊:D。Springside沒有使用這種結(jié)構(gòu),當(dāng)然沒關(guān)系。
          Book是Product的子類,繼承是OO特性,這里顯然考慮周到,Springside也就不是僅能賣書的應(yīng)用了:D。equals、hashCode方法都出現(xiàn)了重復(fù)。不過,重構(gòu)強調(diào)任何形式的重復(fù)都是邪惡的,RoR的Hansson堅信之,所以有了CoC概念。
          不過這里產(chǎn)生一個問題,我實現(xiàn)的一些應(yīng)用中發(fā)現(xiàn)對于Hibernate的繼承,類型轉(zhuǎn)換是個令人頭疼的問題,相當(dāng)不舒服,因為descrimitor對于你是不可見的,你很難在保留id的情況下強行轉(zhuǎn)換一個子類到另一個子類。這點很不靈活,不知大家有什么好辦法?
          Custemer、Category是單純的Pojo。Category沒有實現(xiàn)層次,這點比較失望,感覺應(yīng)該做一個樹形結(jié)構(gòu)的顯示管理的demo。

          下面的部分,我會繼續(xù)分析:D

          posted on 2006-08-30 12:30 Tin 閱讀(2461) 評論(3)  編輯  收藏 所屬分類: Other Project

          評論

          # re: 從Domain開始看Springside 2006-08-30 13:52 dennis
          感興趣的是drools規(guī)則引擎的使用,一直對這東西的性能上有顧慮,不然實在是個很有趣的工具  回復(fù)  更多評論
            

          # re: 從Domain開始看Springside 2006-08-31 15:53 江南白衣
          謝謝你的點評:)
          特別關(guān)心你關(guān)于一些SS1.0中不足的講解,我們在SS 2.0的時候可以加以修正。  回復(fù)  更多評論
            

          # re: 從Domain開始看Springside 2006-08-31 15:56 江南白衣
          user信息是在Controller的bindObject() 方法里完成的,如果發(fā)現(xiàn)它是HistorizableEntity就為它賦值。  回復(fù)  更多評論
            

          主站蜘蛛池模板: 荆门市| 页游| 六枝特区| 灵川县| 合阳县| 甘洛县| 昭平县| 固镇县| 黔南| 射洪县| 兴化市| 潼南县| 玉田县| 金乡县| 娱乐| 长兴县| 荥阳市| 务川| 怀安县| 盘山县| 安塞县| 沙雅县| 昭苏县| 贵南县| 日土县| 千阳县| 楚雄市| 平顶山市| 九龙坡区| 大方县| 蒙阴县| 浦江县| 吐鲁番市| 琼结县| 开化县| 双柏县| 平和县| 贵州省| 长汀县| 天等县| 汾阳市|