Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1938693
  • 博文数量: 219
  • 博客积分: 8963
  • 博客等级: 中将
  • 技术积分: 2125
  • 用 户 组: 普通用户
  • 注册时间: 2005-10-19 12:48
个人简介

文章分类

全部博文(219)

文章存档

2021年(1)

2020年(3)

2015年(4)

2014年(5)

2012年(7)

2011年(37)

2010年(40)

2009年(22)

2008年(17)

2007年(48)

2006年(31)

2005年(4)

分类: Java

2008-12-03 09:28:40

 

最近在用 HIBERNATE,全面向对象,挺方便的。但也有些不方便的地方,可能是自己不够精通的缘故,所以出现了很多问题。

 

下面说说过程吧,我用的是 MyEclipse6.0,要配合 Eclipse3.3 使用,里面自带 Hibernate 插件。安装就不说了,不过不知为什么,插件比较容易出问题,安装完 MyEclipse6.0 后就有时做 Hibernate 反向工程时报错,遇到这种问题时我总是重装解决。

 

 Hibernate 反向工程的使用方法在 MyEclipse 自带的帮助里就有。帮助里不只有一步一步的操作说明,而且还有 Flash 操作动画,我就是参照上面的操作自动生成了 Hibernate 的框架代码,能生成实体类和DAO类,也可以生成HIBERNATE 的配置文件和各个类的配置文件,很方便,但一般需要根据自己的需求改一些配置。生成的代码是由 spring 实例化的,包括连接池什么的。

 

顺便说一句,实际 MyEclipse 的帮助里有很多东西,包括 WebService 插件(可以生成WEBSERVICE代码,布署等等);Ajax 插件 ATF(AjaxTookitFramework),里面有DEBUG AJAX代码的工具,像FF里面的一样。

 

刚才扯得有点远,还是看问题吧:需求是这样的,我要开发一个分页查询的东东,但自动生成的代码里没有分页查询的东西,只能自己写一个方法来实现功能。在网上查了一下,Query 里有 setFirstResult(int) setMaxResults(int) 两个方法,就是取从第 firstResult 到第 maxResult 行的数据。于是我写了如下代码类:

 

public class SerialNumberDAO extends HibernateDaoSupport
{
    public list query(SerialNumber sn)
    {
        Session session;
        Query query;
        try
        {
         session = this.getSession();
         // Transaction tx = session.beginTransaction();

         query = this.getSession().createQuery("select count(*) from SerialNumber");
         sn.setSumRecords(((Integer)query.uniqueResult()).intValue());
         query = this.getSession().createQuery("from SerialNumber");
         query.setFirstResult(sn.getFrom());
         query.setMaxResults(sn.getTo());
         List < SerialNumber > list = query.list();
         // tx.commit();

         return list;
        }
        catch (RuntimeException re)
        {
         log.error("find by property name failed", re);
         throw re;
        }
        /*
        finally
        {
         this.getSession().clear();
         this.getSession().close();
         this.getSessionFactory().close();
        }
        */

    }
}

 

程序在运行几次之后,就会再无反应,查看调试日志,发现最后会打出如下日志:

[org.hibernate.jdbc.ConnectionManager]-[DEBUG] opening JDBC connection

 

打完这条就不再打了,明显是数据库连接问题。于是在 MySQL 中查询进程列表 show processlist; 发现当运行这段程序时,进程列表就会加一条记录,运行其它程序则不会。我用的是 commons-dbcp 连接池,肯定不是连接池的问题,因为其它程序没有问题;那肯定是我这段程序没有释放连接。

 

在网上找了一下,有人说是因为没有提交事务的原因,于是加上了上面被我用 // 注释掉的两句,没有好转。还有人说是 session 没有关闭导致连接没关,于是我又加上了 finally 这段,问题依旧。这个怎么办?

于是看了一下其它方法的实现方式,也看了一些 Spring 的一些原代码,里面是用的 HibernateTemplate find 一些方法做的,没有关于分页查询的。所有的 find 方法里调用的 execute(HibernateCallback action, boolean exposeNativeSession) 方法,我查了一下,HibernateTemplate 里面有这个方法,我照着实现就行了。于是写出了这样的代码:

 

public class SerialNumberDAO extends HibernateDaoSupport

{

public list query(final SerialNumber sn)

{

int i = (Integer) this.getHibernateTemplate().find("select count(*) from SerialNumber").iterator().next();

sn.setSumRecords(i);



List<SerialNumber> list = (List<SerialNumber>) this.getHibernateTemplate().execute(new HibernateCallback()

{

public Object doInHibernate(Session session) throws HibernateException

{

Query queryObject = session.createQuery("from SerialNumber");

queryObject.setFirstResult(sn.getFrom());

queryObject.setMaxResults(sn.getTo());

return queryObject.list();

}

}, false);

return list;

}

}

 

明显是 Spring 的风格^_^,问题解决!

 

随然解决了问题,但还是不知道以第一段代码的方式如何解决问题。希望高人指点。。。。。。

阅读(6610) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chouy2009-04-27 16:04:38

可能你的问题不是出在这里.具体问题具体分析吧.

chinaunix网友2009-04-10 22:23:11

请问,我按照你的方法修改了我的程序,不过还是刷新了大概5次就停止了。