http://www.javayou.com (收藏,设为首页)
当你不能再拥有时,你唯一能做的,就是让自己不要忘记 (手机请访问 http://3g.dlog.cn/javayou)

Hibernate之多次映射同一个类

2006年7月23日(Sunday) 19点28分 作者: 刘冬 天气: 心情: 一般

假设一个博客系统中有一个表用来存储所有的文章,这个表中用一个大文本字段来存储文章的内容。当我们在显示其中一篇文章时,我们需要加载该文章的每一个字段的值。但是另外一种情况,我们仅仅需要列出最新发表的十篇文章,而且仅仅是为了在页面上显示其标题和链接的时候,我们就不希望程序去读取存储文章内容的字段,为什么呢?你不妨做一个测试,同样一个查询,读取大文本字段和不读取大文本字段的性能可能差别是三倍以上。因此为了提升应用性能,我们在显示最新文章列表的时候不想去读取文章的内容字段。但是Hibernate的做法不管你要不要都会把所有的字段读出并映射到bean类相对应的属性中。

我之前有一篇文章在介绍这个解决办法的时候采取的是添加另外一个类,然后在bean的配置文件中把文章内容的字段删掉,这样当我要显示不包含内容的文章列表,我的查询就可以直接针对新增的这个类,我们姑且称这种方法为方法一。

其实还有另外一种做法,那就是利用Hibernate的多次映射同一个类的方法,我们称为方法二。

这个方法与我之前的方法比较不同的在于没有必要再新增另外的类,也就是说对同一个类,可以配置多次,那么Hibernate是通过什么来识别是不同的映射关系呢?先请看下面的配置:

 <class name="BulletinBean" table="dlog_bulletin" entity-name="BulletinBean">
 
      <id name="id" column="bulletin_id" type="int">
   <generator class="identity"/>
  </id>
 
  <property name="type"  type="int" column="bulletin_type"/>
  <property name="status"  type="int" column="status"/>
  <property name="title" type="string"/>
  <property name="content" type="string"/>
 
  <property name="pubTime" type="timestamp" column="pub_time" update="false"/>
  <many-to-one name="site" column="site_id" cascade="none" update="false"/>
 </class>
 
 <class name="BulletinBean" table="dlog_bulletin" entity-name="BulletinOutlineBean">
 
      <id name="id" column="bulletin_id" type="int">
   <generator class="identity"/>
  </id>
 
  <property name="type"  type="int" column="bulletin_type"/>
  <property name="status"  type="int" column="status"/>
  <property name="title" type="string"/>
  <!--
  <property name="content" type="string"/>
  -->
  <property name="pubTime" type="timestamp" column="pub_time" update="false"/>
  <many-to-one name="site" column="site_id" cascade="none" update="false"/>
 </class>

每个class节点都增加了一个entity-name的配置,用来提供给Hibernate识别一个对象,如果没有指定这个值,那么Hibernate默认的让它与class的值相同。有了上面则个配置,当我们需要带内容的查询就可以使用BulletinBean,而不需要内容的查询就使用BulletinOutlineBean。

与方法一比较,方法二优点显而易见,它使系统中的bean类更加清晰、统一、一目了然,但也有不足之处,就是你不能使用Criteria来执行对BulletinOutlineBean的查询。但是最最要命的是通过我的实验表明,一旦你想向表中插入一条记录,你会得到一个异常:没有该类的映射配置!我想这可能是Hibernate考虑不足的地方。

参考文章《关于类继承在Hibernate的问题

标签: Hibernate 
姓名: 
邮箱:  {可选}
网址:  {可选} 此评论只有我和写日记的人查阅
校验码: ... <我看不清楚>
网记为您提供手机和互联网同步的个人主页,带给你不一样的体验