快速业务通道

在Hibernate中直接操作JDBC接口 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
和查阅 Hibernate 的框架源代码及参考文档 ,我们发现,Hibernate 的 Session 会话是进行持久化的基础,所有的持久化操作都是在 Session 的基 础上进行的,在实现上它是和 JDBC 中的 connection 数据库连接绑定的,也就是说,Hibernate 的会话 域基于一个实际的 connection 类实例,二者之间的关系如下图所示:

图 2. Hibernate Session 机制示意图

由上可以看到, Hibernate 中的 session 是单线程的,代表了一次会话的过程。实际上是把一个 JDBC Connection 打包 了,每一个 Session 实例和一个数据库事务绑定。其生命周期是与与之关联的 connection 实例的生命 周期一致的。

在Hibernate中直接操作JDBC接口(6)

时间:2011-08-11 IBM 唐清原

具体解决方案

由上面的 Hibernate 的 Session 机制我们意识到,只要能获 取到 Hibernate 当前会话中的 Connection,则获得了 JDBC 的底层数据库连接实例,剩下就都是 JDBC 的范畴了。再查阅 Hibernate 的 API,发现 HibernateTemplate 类中 SessionFactory 成员的 getCurrentSession() 方法即可获得 Hibernate 环境下的当前活动的 Session 会话,而 Hibernate 中 Session 实例的 connection() 方法即可获得该会话中绑定的 Connection 数据库连接实例。

问 题迎刃而解了,既然可以操作 Connection 实例,那与之关联的 Statement、ResultSet 等基本 JDBC 类 均在我们控制范围中了,我们采用接口模式设计一个轻量级解决方案,使其在保持原 Hibernate 的增删 改操作方式前提下灵活提供操作 JDBC 的接口。设计类图如下图所示:

图 3. 解决方案设计类示 意图

设计中, AbstractHibernateDao 类作为 DAO 操作的基本类,保留原有 Hibenrate 框架下的新增,修改,删除等 API。BaseHibernateDao 类继承 AbstractHibernateDao 类,在此类中增加了直接操作 JDBC 的接口。设 计 getConnection 方法获取 JDBC 的数据库连接实例,设计 getObjectsBySql 方法作为对外的主要接口 ,该方法调用 fetchObjects 方法,这是具体的数据库记录到领域对象的转换操作,需要使用者 override 该方法以完成自有领域对象的填充细节。

在Hibernate中直接操作JDBC接口(7)

时间:2011-08-11 IBM 唐清原

实际实现的类代码如下所示:

清单 6. 解决方案实现代码

AbstractHibernateDao.java: abstract public class  AbstractHibernateDao extends HibernateDaoSupport {   protected Log logger  = LogFactory.getLog(getClass());   protected Class entityClass;    protected Class getEntityClass() {     return entityClass;   }   public List getAll() {     return getHibernateTemplate().loadAll (getEntityClass());   }   public void save(Object o) {      getHibernateTemplate().saveOrUpdate(o);   }   public void removeById (Serializable id) {     remove(get(id));   }   public void  remove(Object o) {     getHibernateTemplate().delete(o);   } } BaseHibernateDao.java: abstract public class BaseHibernateDao extends  AbstractHibernateDao{   public Connection getConnection()   {      try     {       Session curSeesion =null;        Connection con =null;       curSeesion = super.getHibernateTemplate ().getSessionFactory()      .getCurrentSession();       con =  curSeesion.connection();       return con;     }     catch (Exception es)     {      

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号