Posted on 2006-07-23 21:13
canonical 閱讀(5084)
評論(8) 編輯 收藏 所屬分類:
軟件開發(fā)
? hibernate的應(yīng)用中一般總是將entity映射為強(qiáng)類型的java類,這為程序操縱帶來很多便利,同時(shí)可以將大量動(dòng)態(tài)過程隱蔽在對象包絡(luò)之下。映射為java類的一個(gè)主要問題在于無法在程序運(yùn)行時(shí)刻對于程序進(jìn)行修改,而數(shù)據(jù)結(jié)構(gòu)的局部修改幾乎是無法避免的。hibernate3本身支持動(dòng)態(tài)數(shù)據(jù)模型,它允許我們把entity映射為Map數(shù)據(jù)類型, 當(dāng)數(shù)據(jù)結(jié)構(gòu)發(fā)生變化的時(shí)候, 只需要修改hbm文件即可改變映射模型,而不需要修改java實(shí)體類代碼.?
? ? 在hbm定義文件中,如果我們不指定name屬性,而是指定entity-name屬性,則我們可以將entity映射為Map, 而不是一個(gè)java實(shí)體類.
? <class
??? entity-name="test.DynamicEntity"
??? table="DYNAMIC_ENTITY"
? >...</class>
? 此外, 也可以選擇將部分字段動(dòng)態(tài)映射到Map
? <class ...>
??? <dynamic-component name="dynamicAttributes">
????? <property name="foo" column="FOO"/>
????? <property name="bar" column="BAR"/>
??? </dynamic-component>
? </class>
在HQL語句中可以直接使用o.dynamicAttributes.foo來訪問foo屬性,所有操作與普通屬性相同。
? 為了實(shí)現(xiàn)hiberante映射模型的動(dòng)態(tài)更新,我們首先需要實(shí)現(xiàn)sessionFactory的動(dòng)態(tài)更新。目前hibernate的實(shí)現(xiàn)只允許從hbm文件重建sessionFactory, 即新建一個(gè)sessionFactory替換原有的sessionFactory, 在使用spring的情況下,這需要對org.springframework.orm.hibernate3.LocalSessionFactoryBean進(jìn)行小小的hack。
? 為了將動(dòng)態(tài)屬性和普通屬性同樣對待,要求在操作實(shí)體對象屬性的時(shí)候需要能夠自動(dòng)處理nested property, 即需要如下類似的方法:entityDao.getProperty(entity,"dynamicAttributes.foo"), entityDao.setProperty(entity,"dynamicAttributes.foo", attrValue).
? 為了使得應(yīng)用程序自動(dòng)處理新增屬性,要求程序是meta驅(qū)動(dòng)的:當(dāng)實(shí)體對象增加了一個(gè)屬性時(shí),只需要修改meta文件,即可完成對于該屬性的增刪改查匯總等普通應(yīng)用需求。
Feedback
# re: Hibernate動(dòng)態(tài)化 回復(fù) 更多評論
2006-09-16 22:24 by
嘿嘿,和我想的事情素一模一樣的亞!
# re: Hibernate動(dòng)態(tài)化 回復(fù) 更多評論
2006-09-18 00:30 by
嗯,我們對hiberante作了一些擴(kuò)展,包括支持公式字段,附件上傳字段等
# re: Hibernate動(dòng)態(tài)化 回復(fù) 更多評論
2006-10-11 15:05 by
有個(gè)問題:使用 Map,能夠?qū)崿F(xiàn) lazy load 嗎
# re: Hibernate動(dòng)態(tài)化 回復(fù) 更多評論
2007-11-09 15:17 by
能再詳細(xì)點(diǎn)該有多好啊 唉~
# re: Hibernate動(dòng)態(tài)化 回復(fù) 更多評論
2008-03-17 20:17 by
<hibernate-mapping>
<class name="hib.TtItem" table="TT_ITEM" schema="SCOTT">
<id name="id" type="java.lang.Long">
<column name="ID" precision="22" />
<generator class="increment" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="80" />
</property>
<joined-subclass entity-name="Ttbook">
<key column="aid" />
<property name="ttt" type="java.lang.String"></property>
</joined-subclass>
</class>
</hibernate-mapping>
有沒有試驗(yàn)過這樣的配置文件
# re: Hibernate動(dòng)態(tài)化 回復(fù) 更多評論
2008-03-17 20:17 by
我的email:yeti20022@hotmail.com
# re: Hibernate動(dòng)態(tài)化 回復(fù) 更多評論
2010-08-02 16:11 by
能詳細(xì)點(diǎn)嗎,能舉個(gè)列子在spring+hibernate 中動(dòng)態(tài)化具體實(shí)現(xiàn)過程
# re: Hibernate動(dòng)態(tài)化[未登錄] 回復(fù) 更多評論
2010-08-19 14:45 by
能舉個(gè)例子在spring+hibernate中動(dòng)態(tài)化的列子嗎?