`
技术无涯苦作舟
  • 浏览: 11902 次
社区版块
存档分类
最新评论

关于getHibernateTemplate().iterate().next()

阅读更多
使用getHibernateTemplate().iterate().next()的时候报如下错误(只留下了错误的主体部分):
ERROR: Operation not allowed after ResultSet closed
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not get next iterator result
Caused by: java.sql.SQLException: Operation not allowed after ResultSet closed


以下是DAO类,没有使用注解事务.(以下只截取了部分代码)
@Repository("forumHibernateDao")
//@Transactional 
public class ForumHibernateDao extends BaseDao{
    public long getForumNum(){
        Object obj = getHibernateTemplate().iterate("select count(f.forumId) from Forum f").next();
        return (Long) obj;
    }
} 


先说结论:在调用getForumNum()方法的时候报文章开头的错误,在给DAO加上事务后就正常了。

下面看看代码为什么这样。

1.跳转到HibernateTemplate类Iterator<?> iterate()方法中。
public Iterator<?> iterate(final String queryString, final Object... values) throws DataAccessException {
        return (Iterator)this.executeWithNativeSession(new HibernateCallback<Iterator<?>>() {
            public Iterator<?> doInHibernate(Session session) throws HibernateException {
                Query queryObject = session.createQuery(queryString);
                HibernateTemplate.this.prepareQuery(queryObject);
                if(values != null) {
                    for(int i = 0; i < values.length; ++i) {
                        queryObject.setParameter(i, values[i]);
                    }
                }

                return queryObject.iterate();
            }
        });
    }


2. 接着执行HibernateTemplate类的executeWithNativeSession(HibernateCallback<T> action),再执行doExecute(HibernateCallback<T> action, boolean enforceNativeSession),代码如下(重点看划线部分):

public <T> T executeWithNativeSession(HibernateCallback<T> action) {
        return this.doExecute(action, true);
    }

    protected <T> T doExecute(HibernateCallback<T> action, boolean enforceNativeSession) throws DataAccessException {
        Assert.notNull(action, "Callback object must not be null");
        //初始化session
        [u]Session session = null;[/u]
        boolean isNew = false;

        try {
            //通过SessionFactory得到session, 此处所得session为null
            //如果有事务注解,则此处所得session非空
            [u]session = this.getSessionFactory().getCurrentSession();[/u]
        } catch (HibernateException var12) {
            this.logger.debug("Could not retrieve pre-bound Hibernate session", var12);
        }
        //如果有事务注解,则此处所得session非空判断,isNew仍未false
        if(session == null) {
            //session为空则open session.
            [u]session = this.getSessionFactory().openSession();[/u]
            session.setFlushMode(FlushMode.MANUAL);
            //设置isNew为true
            [u]isNew = true;[/u]
        }

        Object var6;
        try {
            this.enableFilters(session);
            Session sessionToExpose = !enforceNativeSession && !this.isExposeNativeSession()?this.createSessionProxy(session):session;
             //调用doInHibernate方法,进行持久化。
            [u]var6 = action.doInHibernate(sessionToExpose);[/u]
        } catch (HibernateException var13) {
            throw SessionFactoryUtils.convertHibernateAccessException(var13);
        } catch (RuntimeException var14) {
            throw var14;
        } finally {
            //isNew为true,所以此处关闭session.
            //如果有事务注解,isNew为false,session不会关闭。
            if(isNew) {
                SessionFactoryUtils.closeSession(session);
            } else {
                this.disableFilters(session);
            }

        }

        return var6;
    }



以上说明在无事务调用next()方法时, session已经关闭,所以在接着调用next()方法的时候抛出异常报错;而若存在事务,则session不会关闭,则可正确调用该方法。
分享到:
评论

相关推荐

    gethibernatetemplate的find方法

    gethibernatetemplate的find方法,find(String queryString);find(String queryString , Object value);find(String queryString, Object[] values);findByExample(Object exampleEntity);findByExample(Object ...

    getHibernateTemplate()有模糊查询和 分页

    `getHibernateTemplate().iterate(queryString).next()`这部分代码似乎是为了获取HQL查询("select count() from Info")的结果,即计算`Info`表中的记录总数。然而,这段代码可能不完整,因为它缺少关闭迭代器和...

    getHibernateTemplate()使用方法

    ### getHibernateTemplate() 使用方法详解 #### 概述 在Java开发中,Hibernate是一个非常流行的持久层框架,它简化了数据库操作,使开发者能够更加高效地进行数据存取。Spring框架进一步封装了Hibernate,提供了`...

    getHibernateTemplate

    `getHibernateTemplate()`方法是Spring框架中用于整合Hibernate ORM的一个关键接口,它是`HibernateDaoSupport`类的一个重要方法。在Spring MVC(S2SH,即Struts2、Spring和Hibernate的组合)架构中,`...

    getHibernateTemplate()查询

    ### getHibernateTemplate()查询详解 #### 一、`find(String queryString)` 此方法用于执行一个HQL查询,其中`queryString`参数表示一个HQL查询字符串。例如: ```java this.getHibernateTemplate().find("from ...

    hibernate模板类详解

    List&lt;User&gt; users = this.getHibernateTemplate().find("from bean.User"); ``` 这条代码会执行一个简单的HQL查询,即“从User表中选择所有记录”,并返回一个包含所有用户对象的列表。 #### 二、find(String ...

    jsp中调用dao的getHibernateTemplate()时,报空指针

    "JSP 中调用 DAO 的 getHibernateTemplate() 时报空指针异常的解决方法" 在整合 SSH 框架时,经常会遇到 JSP 中调用 DAO 的 getHibernateTemplate() 时报空指针异常的错误。本文将讲解这个问题的原因和解决方法。 ...

    getHibernateTemplate分页-模糊查询

    ### getHibernateTemplate分页-模糊查询 #### 一、概述 在Java开发中,使用Hibernate进行数据持久化处理是非常常见的做法。特别是在企业级应用中,为了实现高效的数据库操作与管理,开发者经常需要对数据进行分页...

    手机充值卡充值

    return (Card)this.getHibernateTemplate().get(Card.class, cardPass); } @Override public void updateCard(Card card) { // TODO Auto-generated method stub this.getHibernateTemplate().update(card...

    hibernate保存不到数据1

    标题中的"hibernate保存不到数据1"是一个关于Hibernate框架在尝试保存数据到数据库时遇到问题的场景。描述提到了一个具体的解决方案,即通过在`hibernate.cfg.xml`配置文件中设置`connection.autocommit`属性为`true...

    hql语言中的一些常用的方法

    list = this.getHibernateTemplate().findByExample(u, start, max)`,这里将返回所有名字为“bb”且密码为“123”的用户记录,并支持分页,其中`start`和`max`分别表示起始位置和最大返回记录数。 #### 3. ...

    Spring 和hibernate集成自学笔记

    // 示例:List&lt;User&gt; users = this.getHibernateTemplate().find("from bean.User u where u.name like ?", "%test%"); ``` - **多个参数查询** ```java List&lt;User&gt; find(String queryString, Object[] values)...

    Spring中hql语句的常用方法

    List&lt;User&gt; users = this.getHibernateTemplate().find("from bean.User"); ``` - 这里假设`bean.User`是HQL中的实体类名称,查询结果为所有`User`对象的列表。 2. **find(String queryString, Object value)**...

    JspWeb开发CRUD 操作

    getHibernateTemplate().save(address); } public void insertUser(User user){ getHibernateTemplate().saveOrUpdate(user); } ``` 这里的`save()`方法用于保存新对象到数据库,而`saveOrUpdate()`则更为灵活,...

    HibernateTemplate及generator用法.docx

    关于这两种方式的选择,大多数情况下推荐使用`getHibernateTemplate()`。原因是`getSession()`会在每个操作时创建新的Session,如果在一个线程中有大量的并发操作,这可能导致数据库连接数过多,超出数据库允许的...

    hibernateTemplate和HibernateDaoSupport

    1. `public final HibernateTemplate getHibernateTemplate()`: 返回一个 HibernateTemplate 实例,该实例通过调用 `setSessionFactory` 方法设置的 SessionFactory 创建。这样,DAO 类可以直接使用 ...

    常用的HQL语句!!!!

    this.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { return session.createQuery(hql).executeUpdate();...

    spring_MVC源码

    弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,...

Global site tag (gtag.js) - Google Analytics