注: Hibernate的復雜性是人盡皆知,想問一下Hibernate的退化用法,在JAVA***上發過這個貼子討教,http://www.java***.com/topic/82107 ,可惜那個壇子高手太多,問題還沒看清就開始揮大棒了,只好放這里了,順便把它的一些回貼也貼在這里,望同好們指點一二: 我用Hibernate也有半年了,感覺Hibernate的映射關系太復雜了,與懶性加載,反轉控制等結合在一起,要想控制好,實非常人之所能。個人感覺,如果不用Hibernate的關聯,就把它當作關系數據庫來操作,使用和理解上都會方便不少,例如一個訂單和產品的配置文件寫成這樣: <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>
操作時: 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中的寫法,此處略) 這樣一來,純粹是用關系數據庫的思想來使用Hibernate,一個類對應一個數據庫表,表之間的約束交給數據庫的鍵來控制, 這樣一來,即得到了Hibernate的優點:不用手工寫SQL,對象級別緩存,數據庫可移植性,也不必費力地學習和理解它了,純粹是一個薄薄的JDBC的包裝; 缺點就是不能在HQL中寫出"...object1.object2.object3..." 式的對象引用,而且關聯表的加載要自已來維護,但我認為相對于理解它復雜的配置來說,這點犧牲還是值得的, Hibernate的高級特性當然沒法用上了,但相比于直接用JDBC或用ibatis寫SQL總要好得多,只要會關系數據庫,就能立即上手,在新手多、工期短的項目中,可節省很多培訓時間,而且對于后來維護者的要求也大大降低,請問我的這種想法是否可行?
以下為JAVA***上的回答 引用 java語言不是動態語言,簡化不了這些操作。activeRecord給有我們非份之想,好像馬丁大叔就在嘗試做類時的orm框架。還有jruby給了我們可行的機會
drinkjava回答:答非所問,離題太遠。 -------------------------------------- 引用 不映射成類怎么利用OO思想啊,hibernate可以對一個對象進行操作,jdbc不行啊,主要是可以利用OO思想
drinkjava回答:你根本就沒看明白這個貼子的觀點,我的意思是完全不用OO思想,只是將Hibernate當作一個比jdbc順手點的工具而已,我用關系數據庫好多年了,也開發過上百個表的應用,不用OO不也照樣做挺好?JDBC不行,可也沒人說不準用JDBC吧?
-------------------------------------- 引用 請再好好理解一下ORMapping的含義。 另外不能充分發揮關聯關系的優勢,是否是因為沒有遵循“對象模型” -> “關系模型” -> “Hibernate映射規則”的開發順序? drinkjava回答:同上,不是我沒理解,而是本來就沒打算采用“對象模型” -> “關系模型”,而是直接一個表對應一個類,走的是"關系模型"的路子。
-------------------------------------- 引用 不用關系影射,你用Hibernate干什么。
drinkjava回答: 咱笨,用不好關聯映射,怕出錯,所以干脆不用它,可關系模型咱還是很精通的,所有的關系就交給數據庫去約束它好了。至于為什么還要用Hibernate,是相比JDBC和ibatis來說的:不用寫很多SQL,有緩存,跨數據庫,支持分頁,Spring支持,總之好處一言難盡啊...
-------------------------------------- 引用 性能上去了,面向對象特性沒有了
drinkjava回答: 不知你是為了OO而開發,還是為了開發而OO?
-------------------------------------- 引用 我第一次用Hibernate的時候就是這么用的 然后涉及到多表連接時統統搞成視圖
drinkjava回答: 不會這么恐怖吧?Hibernate很能干的,你google一下“hibernate多表查詢”就知道了。
-------------------------------------- 引用 我就這樣用了快2年了, 非常的簡便,門檻非常的低,效率也非常不錯 級聯查詢統計返回object[]
drinkjava回答: 可見笨人不只我一個啊,這個居然用了2年。Hibernate的這種用法確實很另類,與它誕生的初衷可說是背道而馳,但事實上,這種方式程序跑起來絕對沒問題,問題是這種用法能否被團隊接受,讓我用起來心里有個底,這才是我發貼詢問的原因。光一個人私底下用,當然沒人會來說三道四,問題是能不能引入到團隊開發中,作為一種替代JDBC的簡易方案,而不是被團隊中的高手當作異已一棒子打死,因為通常一提到Hibernate大家就會聯想到ORM,這確實是一個很容易陷入的思維慣性,事實上,前面幾個回貼都是這樣,也不想想貼子要表達的是什么,就開始反駁了。 |