posts - 176, comments - 240, trackbacks - 0, articles - 7

Hibernate动态化

Posted on 2006-07-23 21:13 canonical 阅读(5064) 评论(8)  编辑  收藏 所属分类: 软件开发
  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文件,即可完成对于该属性的增删改查汇总等普通应用需求。

Feedback

# re: Hibernate动态化  回复  更多评论   

2006-09-16 22:24 by 曹晓钢
嘿嘿,和我想的事情素一模一样的亚!

# re: Hibernate动态化  回复  更多评论   

2006-09-18 00:30 by canonical
嗯,我们对hiberante作了一些扩展,包括支持公式字段,附件上传字段等

# re: Hibernate动态化  回复  更多评论   

2006-10-11 15:05 by jiaoly
有个问题:使用 Map,能够实现 lazy load 吗

# re: Hibernate动态化  回复  更多评论   

2007-11-09 15:17 by aiai
能再详细点该有多好啊 唉~

# re: Hibernate动态化  回复  更多评论   

2008-03-17 20:17 by yeti20011
<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>
有没有试验过这样的配置文件

# re: Hibernate动态化  回复  更多评论   

2008-03-17 20:17 by yeti20011
我的email:yeti20022@hotmail.com

# re: Hibernate动态化  回复  更多评论   

2010-08-02 16:11 by 技术学习
能详细点吗,能举个列子在spring+hibernate 中动态化具体实现过程

# re: Hibernate动态化[未登录]  回复  更多评论   

2010-08-19 14:45 by Java
能举个例子在spring+hibernate中动态化的列子吗?

只有注册用户登录后才能发表评论。


网站导航: