使用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方法,find(String queryString);find(String queryString , Object value);find(String queryString, Object[] values);findByExample(Object exampleEntity);findByExample(Object ...
`getHibernateTemplate().iterate(queryString).next()`这部分代码似乎是为了获取HQL查询("select count() from Info")的结果,即计算`Info`表中的记录总数。然而,这段代码可能不完整,因为它缺少关闭迭代器和...
### getHibernateTemplate() 使用方法详解 #### 概述 在Java开发中,Hibernate是一个非常流行的持久层框架,它简化了数据库操作,使开发者能够更加高效地进行数据存取。Spring框架进一步封装了Hibernate,提供了`...
`getHibernateTemplate()`方法是Spring框架中用于整合Hibernate ORM的一个关键接口,它是`HibernateDaoSupport`类的一个重要方法。在Spring MVC(S2SH,即Struts2、Spring和Hibernate的组合)架构中,`...
### getHibernateTemplate()查询详解 #### 一、`find(String queryString)` 此方法用于执行一个HQL查询,其中`queryString`参数表示一个HQL查询字符串。例如: ```java this.getHibernateTemplate().find("from ...
List<User> users = this.getHibernateTemplate().find("from bean.User"); ``` 这条代码会执行一个简单的HQL查询,即“从User表中选择所有记录”,并返回一个包含所有用户对象的列表。 #### 二、find(String ...
### getHibernateTemplate分页-模糊查询 #### 一、概述 在Java开发中,使用Hibernate进行数据持久化处理是非常常见的做法。特别是在企业级应用中,为了实现高效的数据库操作与管理,开发者经常需要对数据进行分页...
"JSP 中调用 DAO 的 getHibernateTemplate() 时报空指针异常的解决方法" 在整合 SSH 框架时,经常会遇到 JSP 中调用 DAO 的 getHibernateTemplate() 时报空指针异常的错误。本文将讲解这个问题的原因和解决方法。 ...
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框架在尝试保存数据到数据库时遇到问题的场景。描述提到了一个具体的解决方案,即通过在`hibernate.cfg.xml`配置文件中设置`connection.autocommit`属性为`true...
list = this.getHibernateTemplate().findByExample(u, start, max)`,这里将返回所有名字为“bb”且密码为“123”的用户记录,并支持分页,其中`start`和`max`分别表示起始位置和最大返回记录数。 #### 3. ...
// 示例:List<User> users = this.getHibernateTemplate().find("from bean.User u where u.name like ?", "%test%"); ``` - **多个参数查询** ```java List<User> find(String queryString, Object[] values)...
List<User> userList = this.getHibernateTemplate().find("from bean.User"); ``` 此方法将返回所有的`User`对象列表。 #### 二、find(String queryString, Object value) 该方法支持通过参数化的方式执行查询,...
List<User> users = this.getHibernateTemplate().find("from bean.User"); ``` - 这里假设`bean.User`是HQL中的实体类名称,查询结果为所有`User`对象的列表。 2. **find(String queryString, Object value)**...
getHibernateTemplate().save(address); } public void insertUser(User user){ getHibernateTemplate().saveOrUpdate(user); } ``` 这里的`save()`方法用于保存新对象到数据库,而`saveOrUpdate()`则更为灵活,...
关于这两种方式的选择,大多数情况下推荐使用`getHibernateTemplate()`。原因是`getSession()`会在每个操作时创建新的Session,如果在一个线程中有大量的并发操作,这可能导致数据库连接数过多,超出数据库允许的...
1. `public final HibernateTemplate getHibernateTemplate()`: 返回一个 HibernateTemplate 实例,该实例通过调用 `setSessionFactory` 方法设置的 SessionFactory 创建。这样,DAO 类可以直接使用 ...
this.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { return session.createQuery(hql).executeUpdate();...
弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,...