随笔-86  评论-767  文章-3  trackbacks-3

   虽然在04年5月份的毕业设计中使用了Hibernate,不过核心模块不是自己写的,所以陌生的部分多过熟悉的.有些东西的理解是需要经过实践的积累的,不是仅仅依靠看理论材料和写简单的测试代码可以做到的.

   A、什么时候使用Hibernate?

   Hibernate是业界一个比较成熟的流行的O/R Mapping框架.
   说它成熟,因为他提供了一个O/R Mapping产品最主要的功能,比如数据库映射、连接池管理、事务支持等等,更重要的,它提供了对多中数据库产品的支持.也许,O/R Mapping和多数据库支持更能够吸引开发者的眼球.
   说它流行,因为太多的人使用了,不论是从实用开发的角度出发,还是从研究的角度出发,甚至是从赶时髦的角度出发.相对于没有自己的数据持久层开发能力的开发者角度看,hibernate的确能够为他们带来开发效率的提高,改进软件架构.

   那么在什么情况下选择使用hibernate来构建自己的数据持久层呢?

1、自己没有数据持久层开发能力

这个当然勿庸置疑了.hibernate提供了一套成熟的模型,能够在短时间内构建适合业务需求的数据持久层.当然,前提是要对hibernate有基本的使用开发能力.

2、对JDBC底层开发不甚熟悉者.

hibernate封装了对JDBC底层的调用,统一了对不同类型数据库系统的支持.在缺乏对JDBC底层调用的了解之前,使用Hibernate可以事半功倍.

3、团队开发中统一持久层开发.

我们把hibernate称为O/R Mapping开发框架.既然是框架,那么如果团队中的成员对这个框架比较熟悉的话,那么可以统一团队的开发,减少沟通的频率,促进协同开发.

4、自己开发的数据持久层不能满足业务需求.

如果缺乏对JDBC的了解和数据持久层开发的经验,可能自己开发的数据持久层会慢慢的不满足业务需求.比如在数据缓存、连接池管理、多数据库支持等等方面.hibernate在上述方面有比较出色的表现,自然在不影响业务开发的前提下可以考虑采用.

5、希望你的产品不依赖于某种特定的数据库.

B、如何设计适用于多种类型数据库的通用产品呢?

如果你开发的是一款通用产品,使用了MS-SQL2000数据库,可能某一天你的客户会要求你将产品迁移到Oracle,理由很简单--客户原来就有购买Oracle数据库,不希望再增加数据投资了.但是你只能很遗憾的告诉他,你的产品只能使用MS-SQL2000数据库.无疑,你将可能失去一个重要的准客户.

那么,如何设计适用于多种类型数据库的通用产品而不是提供多个产品版本呢?

由于JDBC本身就是数据库独立的,即不依赖于具体的数据库类型.因此,我们可以从以下几方面进行把握:

1、尽量使用标准通用的SQL语句.

2、尽量上不使用各数据库方言和某种数据库特有的函数或者数据类型,尽量通用.

3、将配置参数保存在一个properties文件中.

4、利用Configuration.setProperties(Properties pro)方法载入配置参数文件,而不是采用Configuration.configuration()默认自动载入hibernate.hbm.xml配置文件.

C、选择合适的获得JDBC连接方式

假设已经配置了数据库表映射文件并得到了SessionFactory:

Configuration cfg = new Configuration();

SessionFactory sessionFactory = cfg.buildSessionFactory

在这里我们讨论一下三种获得JDBC连接的方式:

1、用户自己提供JDBC连接:

java.sql.Connection conn = datasource.getConnection();

Session session = sessionFactory.openSession(conn);

这种方式允许用户程序自己来管理JDBC连接.不过同一个连接上不能打开两个并行的session.

2、使用Hibernate默认的JDBC连接方式:

通过一下四种方式设置JDBC连接参数:

a、传递一个java.util.Properties到Configuration.setProperties();

b、在classpath目录提供一个hibernate.properties配置文件;

c、在hibernate.hbm.xml中包含JDBC配置参数;

d、通过java -Dproperty=value指定系统属性.

之后使用Session session = sessionFactory.openSession()获取JDBC连接.这个时候所有的hibernate属性和约束都保存在net.sf.hibernate.cfg.Environment中.

3、使用JNDI获得JDBC连接:

这个应该可以归到2上,不过比较特别,独立出来.

使用JNDI获得JDBC连接要依赖于Application Server的JNDI特性,不过可以将JDBC的管理交给Application Server去完成.采用这种方法获得的JDBC自动集成Application Server的容器管理事务的特性.不过如果更换容器之后都需要重新部署容器的JNDI.

D、什么时候POJO需要实现equals和hashCode方法?

当你需要混合使用POJO的时候,比如使用set,必须考虑重载equals和hashCode,特别是在两个不同的session装载POJO.Hibernate只在单个session保证JVM鉴别,而且是使用Object默认的equals和hashCode,如果没有重载equals和hashCode.

在通常情况下,重载equals和hashCode方法,我们会在方法中比较POJO的标识关键字.不过,在hibernate中,如果这个POJO还没有持久化,那么POJO的表示关键字是不存在的.所以,我们会采用商业关键字相等的原则来判断两个POJO是否相等.

E、如何合理利用hibernate提供的数据二级缓存功能:

1、惰性载入机制

2、接口代理机制

3、隐式多态机制

posted on 2005-02-05 14:16 eamoi 阅读(2577) 评论(2)  编辑  收藏 所属分类: Java

评论:
# re: Hibernate重新学习和使用手记(1) 2006-02-05 23:35 | River
说得很客观,Hibernate 不过是个O/R Map的框架,如何使用应看你实际情况,建议:如果你对关系数据库及JDBC已经有了很好的撑握,没有必要使用Hibernate.  回复  更多评论
  
# re: Hibernate重新学习和使用手记(1) 2006-03-04 21:21 | 赵承恩
留名感谢
这篇文章中的
之后使用Session session = sessionFactory.openSession()获取JDBC连接.这个时候所有的hibernate属性和约束都保存在net.sf.hibernate.cfg.Environment中.
这句话非常重要
让我一个晚上的工作没有白费
非常感谢  回复  更多评论
  

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


网站导航: