? hibernate的應用中一般總是將entity映射為強類型的java類,這為程序操縱帶來很多便利,同時可以將大量動態過程隱蔽在對象包絡之下。映射為java類的一個主要問題在于無法在程序運行時刻對于程序進行修改,而數據結構的局部修改幾乎是無法避免的。hibernate3本身支持動態數據模型,它允許我們把entity映射為Map數據類型, 當數據結構發生變化的時候, 只需要修改hbm文件即可改變映射模型,而不需要修改java實體類代碼.?
? ? 在hbm定義文件中,如果我們不指定name屬性,而是指定entity-name屬性,則我們可以將entity映射為Map, 而不是一個java實體類.
? <class
??? entity-name="test.DynamicEntity"
??? table="DYNAMIC_ENTITY"
? >...</class>
? 此外, 也可以選擇將部分字段動態映射到Map
? <class ...>
??? <dynamic-component name="dynamicAttributes">
????? <property name="foo" column="FOO"/>
????? <property name="bar" column="BAR"/>
??? </dynamic-component>
? </class>
在HQL語句中可以直接使用o.dynamicAttributes.foo來訪問foo屬性,所有操作與普通屬性相同。
? 為了實現hiberante映射模型的動態更新,我們首先需要實現sessionFactory的動態更新。目前hibernate的實現只允許從hbm文件重建sessionFactory, 即新建一個sessionFactory替換原有的sessionFactory, 在使用spring的情況下,這需要對org.springframework.orm.hibernate3.LocalSessionFactoryBean進行小小的hack。
? 為了將動態屬性和普通屬性同樣對待,要求在操作實體對象屬性的時候需要能夠自動處理nested property, 即需要如下類似的方法:entityDao.getProperty(entity,"dynamicAttributes.foo"), entityDao.setProperty(entity,"dynamicAttributes.foo", attrValue).
? 為了使得應用程序自動處理新增屬性,要求程序是meta驅動的:當實體對象增加了一個屬性時,只需要修改meta文件,即可完成對于該屬性的增刪改查匯總等普通應用需求。
? ? 在hbm定義文件中,如果我們不指定name屬性,而是指定entity-name屬性,則我們可以將entity映射為Map, 而不是一個java實體類.
? <class
??? entity-name="test.DynamicEntity"
??? table="DYNAMIC_ENTITY"
? >...</class>
? 此外, 也可以選擇將部分字段動態映射到Map
? <class ...>
??? <dynamic-component name="dynamicAttributes">
????? <property name="foo" column="FOO"/>
????? <property name="bar" column="BAR"/>
??? </dynamic-component>
? </class>
在HQL語句中可以直接使用o.dynamicAttributes.foo來訪問foo屬性,所有操作與普通屬性相同。
? 為了實現hiberante映射模型的動態更新,我們首先需要實現sessionFactory的動態更新。目前hibernate的實現只允許從hbm文件重建sessionFactory, 即新建一個sessionFactory替換原有的sessionFactory, 在使用spring的情況下,這需要對org.springframework.orm.hibernate3.LocalSessionFactoryBean進行小小的hack。
? 為了將動態屬性和普通屬性同樣對待,要求在操作實體對象屬性的時候需要能夠自動處理nested property, 即需要如下類似的方法:entityDao.getProperty(entity,"dynamicAttributes.foo"), entityDao.setProperty(entity,"dynamicAttributes.foo", attrValue).
? 為了使得應用程序自動處理新增屬性,要求程序是meta驅動的:當實體對象增加了一個屬性時,只需要修改meta文件,即可完成對于該屬性的增刪改查匯總等普通應用需求。