SSH系列(三)--Hibernate进阶

来源:互联网 发布:淘宝虚拟店铺入驻 编辑:程序博客网 时间:2024/05/01 06:37

      在上篇系列中我简要的谈到了一下Hibernate的基本的实用方法,在这里我觉得对于一个技术(不论是开源项目或是行业中的某种标准技术)我们的认知是可以分为四个层次:

      第一个层次是“知道,了解”,它的要求仅仅是我们听说过这个技术,知道它是干什么的或是看过几篇文章,可以跟人简单的侃一侃;第二个层次是“会用”,就是能够就这个技术熟练的写出"hello world",掌握了其基本的用法,能够在实际项目中使用;第三个层次是“精通”,就是对于这个技术很熟练了,知道其内部原理和优化使用,能够解决在实际项目中使用这种技术遇到的一些“灵异问题”,算是使用这个技术的大哪了;第四个层次是“融会贯通,创新”,即不但能熟练的使用这个技术,并且能理解这个技术的优势或新异的本质,能够将这个本质应用于其它的一些实现中,并不拘泥于这个技术中。由此可见,对于一个新技术的掌握,其层次是分的很开的,层次不同,当然其掌握就不一样,所需要花的时间也不一样,所以经常看有些书封面写的多少小时完全掌握一个什么技术,其实那都仅仅是个皮毛。  

      好了,言归正转,我们来谈谈Hibernate中的一些较深的内容。

     先来看看实体映射,简单的实体映射就不用太多说了,一个表对应一个pojo利用xxx.hbm.xml配置文件,这里有一点要注意就是pojo的bean文件中setter或是getter方法要制定成public的,这要可以提供Hibernate的性能。对于pojo的某个属性我们可以采用自定义的数据类型,即非基本数据类型,例如List,但其实这仅仅在于从数据库表中读出时可以自动专程List,而我们在写入时还是数据库表所支持的那些数据类型。对于数据库表我们知道其还有复合主键的概念,Hibernate同样支持。另外一个是对Blob,Clob这样的大字段类型的映射,Hibernate和Oracle配合起来有些特殊,和Sql server2000则没有。

     以上是简单的实体映射,像Hibernate这样的ORM解决方案来说难点在于二维的关系型数据库表和面向对象结构(面向对象的特点有封装,继承,多态)的POJO的对应,简单的映射是没有反应出面向对象的特性的。 我们可以将一个表中的字段分别映射到多个 POJO中,这样在设计的粒度上更加清晰,实际上也是实现了对于传统关系型库表的面向对象的领域划分,在xxx.hbm.xml中使用结点component。 在Hibernate3中对于POJO的属性提供了延迟加载,这样可以有效地提高我们读取部分表字段的性能。对于继承关系的多个POJO,Hibernate也提供了3种映射方法:一是父类和各子类都对应一个表(这在我的一个实际项目中可以采用这种方式来解决数据库表的union的问题,当然也可以用HQL查询语言来解决),在做查询时Hibernate会自动查询所有父类和子类对应的表,这种方法不好的地方在于改动父类的属性映射,各子类的映射文件也要改动;第二种方法是子类对应的表中只包含扩展的属性字段,这样的话xxx.hbm.xml只需要一个,在配置文件中利用joined-subclass结点来引入子类的控制属性的映射;最后一种方法是只要一个大表,将父类和各子类所以得属性字段都包括进来,配置文件也是一个,需要用到discriminator节点来声明子类辨别标示的字段,这也就是说在数据库表中要多一个字段来做标示作用,另外用到subclass节点来配合discriminator节点。

      以上是实体映射方面,下面我们来谈谈另一个比较麻烦的问题--数据关联

      所以我们要明白数据关联不等同于联合查询(就是指select中的join),我们在以前的面向sql语句的数据库编程中是没有数据关联这个概念的,以前我们对于多表之间的一条sql语句的操作只限于select,但有了数据关联,我们可以同时对多表进行增,删,改。这都是由于现在是有了ORM的技术,才有了数据关联这个概念,因为对象是很容易产生关联的,想象我们以前如果要往两个表中都插入一条记录,我们要写两条sql语句,然后batch执行,现在我们只须对一个对象进行save,通过xxx.hbm.xml的配置Hibernate会自动往另一个表中插入一条数据,当然其底层实现上还是有两条sql语句的,只不果我们在上层应用时不用写出来。

       说了这么多,到底数据关联具体是怎么回事了?

       数据关联可以看成是两个表之间的对应的某条或几条数据之间的关联(为什么是两个表之间,而不是多个表之间了,应为多个表之间的关联到具体的都可以拆成两两关联),那这些关联可分为一对一关联,包括主键关联,外键关联;一对多关联,包括单向一对多和双向一对多(也就是一对多和多对一);多对多关联。

       具体的配置和特性我们下篇blog在讲。另外还有在下一篇还要谈到Hibernate的一些高级特性和性能优化方面的问题,这也可以算成是第三个层次了,呵呵。

       未完,待续........