站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题Hibernate O/R映射三大基本定则

Hibernate O/R映射三大基本定则

摘要: Hibernate O/R映射三大基本定则

1. 引言
在Java环境下,有多种对象关系映射方法,如实体Bean、OJB、JDO、JDBC等。
Hibernate是一种新的O/R映射工具,它不仅提供了从Java类到数据表的映射,也提
供了数据查询和恢复等机制。Hibernate非常简单易学,目前国内有很多同行已经或
正在用Hibernate开发实施项目;但Hibernate有很多规则不为人知或应用甚少。本文
的目的就是将这些规则归纳总结,希望对您的开发和设计有益。
首先声明,本文是Hibernate入门级文章,但有两点要特殊提醒:1)本文不是手把手教
程,您必须亲自实践一个Hibernate例程后看本文才能有所收获;2)作者相信,即便您
已经用Hibernate开发实施数个项目,您也能从本文受益。
2. 基本定则
定则一:数据库配置文件名称可以不是Hibernate.properties或Hibernate.cfg.xml
由于Hibernate官方文档(本文指www.hibernate.org的文档)的影响,很多Hibernate
开发者误以为系统一定要有名称为Hibernate.properties或Hibernate.cfg.xml的文
件,而且一定要放在classes的根目录下。实际上,该文件只是一般的配置文件,名称
可以自己取,文件位置可以自己定,而且在多数据库环境下,可以有多个配置文件,使
得程序可以连接多个数据库。只是您在创建会话工厂时需要特殊处理,代码示例如下:
//配置文件名称
protected static String CONFIG_FILE = "my_hibernate.config";
//配置文件目录,可以考虑在该目录下存放系统所有配置文件,此处使用虚拟机参数
String configPath = System.getProperty("my.config");
//创建会话工厂
sessionFactory =( new Configuration().configure(new File(configPath+File.separator+CONFIG_FILE))) .buildSessionFactory();
定则二:小型项目中,.hbm.xml文件可以合并到一个文件中
同样由于Hibernate官方文档的影响,很多Hibernate开发者误以为Hibernate的对象
关系映射一定要一个表对应一个对象,并将映射文件和对象文件放在同一目录下。实
际上,该模式是为规范性考虑而设计的,因为在多人参与的项目中,多人要维护同一文
件容易产生冲突;当项目比较小时,配置文件的维护人员少,我们完全可以将.hbm.xml
文件合并到一个或者几个文件中。依据作者本人的项目设计开发经验,最好是项目中
有几人同时从事O/R映射和持久工作,则设定几个.hbm.xml文件,每人维护一个。当然
,为了便于分类和管理,每人的工作应该按逻辑划分。
大型项目中的文件配置示例如下:







小型项目中的文件配置示例如下:






要注意的是, 从对Hibernate源代码的分析可知,指定映射文件时,不能用绝对目录,
只能用相对目录;而且,系统以classes根目录为当前目录。
定则三:对象关系映射是以.hbm.xml文件为基准的,而不是以PO文件为基准
该定律的意思是:系统启动检查您的对象关系映射是否正确时,是以.hbm.xml为基准
来进行检查的;对象文件的property可以比映射文件的property多,但不能少。如果
您有如下的映射:









系统启动,检查数据库和其他配置正确后,将以该文件为基准,首先检查User对象中有
无id属性和对应的get/set方法,如果没有则报错,如果有且正确则检查有无name属性
和对应的get/set方法……,直到文件结束。要注意的是,如果属性为name,则get方法
名称必须为getName(),set方法名称必须为setName(),否则会报错。
如果User对象除了有id,name,loginName, passwd四个属性和对应的方法,还有其它
的属性和方法,会报错吗?不会,因为对象关系映射是以.hbm.xml文件为基准的,而不
是以PO文件为基准。您在项目中可以充分利用该特点,实现您自己的比较特殊的需求
。例如,您可以在User对象中加入updatedPasswd表示更改后的口令,由此构造在表示
层要使用的FormBean和在业务层要使用的ValueObject。当然,这样做也有缺点,需要
根据您的实际情况而定。
3. 总结
上面是作者对Hibernate映射的容易理解错误的知识点的归纳总结,希望对您有帮助
。如果您发现有错误或有新的观点,欢迎与作者(hongbo.yang@zznode.com)讨论。
↑返回目录
前一篇: Hibernate 针对 Oracle 特有函数及自定义函数的实现办法
后一篇: Hibernate2 参考文档