注: Hibernate的復(fù)雜性是人盡皆知,想問一下Hibernate的退化用法,在JAVA***上發(fā)過這個(gè)貼子討教,http://www.java***.com/topic/82107 ,可惜那個(gè)壇子高手太多,問題還沒看清就開始揮大棒了,只好放這里了,順便把它的一些回貼也貼在這里,望同好們指點(diǎn)一二: 我用Hibernate也有半年了,感覺Hibernate的映射關(guān)系太復(fù)雜了,與懶性加載,反轉(zhuǎn)控制等結(jié)合在一起,要想控制好,實(shí)非常人之所能。個(gè)人感覺,如果不用Hibernate的關(guān)聯(lián),就把它當(dāng)作關(guān)系數(shù)據(jù)庫來操作,使用和理解上都會(huì)方便不少,例如一個(gè)訂單和產(chǎn)品的配置文件寫成這樣: <hibernate-mapping> <class name="db.Order" table="orders" catalog="sample"> <id name="id" type="java.lang.String"> <column name="ID" length="32" /> <generator class="uuid.hex" /> </id> <property name="orderTitle" type="java.lang.String"> <column name="ORDER_TITLE" length="30" /> </property> </class> </hibernate-mapping>
<hibernate-mapping> <class name="db.Product" table="products" catalog="sample"> <id name="id" type="java.lang.String"> <column name="ID" length="32" /> <generator class="uuid.hex" /> </id> <property name="productTitle" type="java.lang.String"> <column name="PRODUCT_TITLE" length="30" /> </property> <property name="orderId" type="java.lang.String"> <column name="ORDER_ID" length="32" /> </property> </class> </hibernate-mapping>
操作時(shí): Order o=new Order(); o.setOrderTitle("order1"); dao.saveOne(o); Product p=new Product(); p.setProductTitle("product1"); p.setOrderId(o.getId()); dao.saveOne(p); (HQL查詢則仿照普通SQL中的寫法,此處略) 這樣一來,純粹是用關(guān)系數(shù)據(jù)庫的思想來使用Hibernate,一個(gè)類對(duì)應(yīng)一個(gè)數(shù)據(jù)庫表,表之間的約束交給數(shù)據(jù)庫的鍵來控制, 這樣一來,即得到了Hibernate的優(yōu)點(diǎn):不用手工寫SQL,對(duì)象級(jí)別緩存,數(shù)據(jù)庫可移植性,也不必費(fèi)力地學(xué)習(xí)和理解它了,純粹是一個(gè)薄薄的JDBC的包裝; 缺點(diǎn)就是不能在HQL中寫出"...object1.object2.object3..." 式的對(duì)象引用,而且關(guān)聯(lián)表的加載要自已來維護(hù),但我認(rèn)為相對(duì)于理解它復(fù)雜的配置來說,這點(diǎn)犧牲還是值得的, Hibernate的高級(jí)特性當(dāng)然沒法用上了,但相比于直接用JDBC或用ibatis寫SQL總要好得多,只要會(huì)關(guān)系數(shù)據(jù)庫,就能立即上手,在新手多、工期短的項(xiàng)目中,可節(jié)省很多培訓(xùn)時(shí)間,而且對(duì)于后來維護(hù)者的要求也大大降低,請(qǐng)問我的這種想法是否可行?
以下為JAVA***上的回答 引用 java語言不是動(dòng)態(tài)語言,簡化不了這些操作。activeRecord給有我們非份之想,好像馬丁大叔就在嘗試做類時(shí)的orm框架。還有jruby給了我們可行的機(jī)會(huì)
drinkjava回答:答非所問,離題太遠(yuǎn)。 -------------------------------------- 引用 不映射成類怎么利用OO思想啊,hibernate可以對(duì)一個(gè)對(duì)象進(jìn)行操作,jdbc不行啊,主要是可以利用OO思想
drinkjava回答:你根本就沒看明白這個(gè)貼子的觀點(diǎn),我的意思是完全不用OO思想,只是將Hibernate當(dāng)作一個(gè)比jdbc順手點(diǎn)的工具而已,我用關(guān)系數(shù)據(jù)庫好多年了,也開發(fā)過上百個(gè)表的應(yīng)用,不用OO不也照樣做挺好?JDBC不行,可也沒人說不準(zhǔn)用JDBC吧?
-------------------------------------- 引用 請(qǐng)?jiān)俸煤美斫庖幌翺RMapping的含義。 另外不能充分發(fā)揮關(guān)聯(lián)關(guān)系的優(yōu)勢,是否是因?yàn)闆]有遵循“對(duì)象模型” -> “關(guān)系模型” -> “Hibernate映射規(guī)則”的開發(fā)順序? drinkjava回答:同上,不是我沒理解,而是本來就沒打算采用“對(duì)象模型” -> “關(guān)系模型”,而是直接一個(gè)表對(duì)應(yīng)一個(gè)類,走的是"關(guān)系模型"的路子。
-------------------------------------- 引用 不用關(guān)系影射,你用Hibernate干什么。
drinkjava回答: 咱笨,用不好關(guān)聯(lián)映射,怕出錯(cuò),所以干脆不用它,可關(guān)系模型咱還是很精通的,所有的關(guān)系就交給數(shù)據(jù)庫去約束它好了。至于為什么還要用Hibernate,是相比JDBC和ibatis來說的:不用寫很多SQL,有緩存,跨數(shù)據(jù)庫,支持分頁,Spring支持,總之好處一言難盡啊...
-------------------------------------- 引用 性能上去了,面向?qū)ο筇匦詻]有了
drinkjava回答: 不知你是為了OO而開發(fā),還是為了開發(fā)而OO?
-------------------------------------- 引用 我第一次用Hibernate的時(shí)候就是這么用的 然后涉及到多表連接時(shí)統(tǒng)統(tǒng)搞成視圖
drinkjava回答: 不會(huì)這么恐怖吧?Hibernate很能干的,你google一下“hibernate多表查詢”就知道了。
-------------------------------------- 引用 我就這樣用了快2年了, 非常的簡便,門檻非常的低,效率也非常不錯(cuò) 級(jí)聯(lián)查詢統(tǒng)計(jì)返回object[]
drinkjava回答: 可見笨人不只我一個(gè)啊,這個(gè)居然用了2年。Hibernate的這種用法確實(shí)很另類,與它誕生的初衷可說是背道而馳,但事實(shí)上,這種方式程序跑起來絕對(duì)沒問題,問題是這種用法能否被團(tuán)隊(duì)接受,讓我用起來心里有個(gè)底,這才是我發(fā)貼詢問的原因。光一個(gè)人私底下用,當(dāng)然沒人會(huì)來說三道四,問題是能不能引入到團(tuán)隊(duì)開發(fā)中,作為一種替代JDBC的簡易方案,而不是被團(tuán)隊(duì)中的高手當(dāng)作異已一棒子打死,因?yàn)橥ǔR惶岬?b>Hibernate大家就會(huì)聯(lián)想到ORM,這確實(shí)是一個(gè)很容易陷入的思維慣性,事實(shí)上,前面幾個(gè)回貼都是這樣,也不想想貼子要表達(dá)的是什么,就開始反駁了。 |