Spring+Hibernat openSessionInView 解决

本文介绍了一个关于Spring+Hibernate+IceFaces项目中遇到的collectionwithtwoopensessions异常问题及解决方案。作者通过调整DAOBase层的方法,确保在进行实体保存操作时只开启一个Session,从而避免了异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近自己做了个小项目(练习),使用Spring+Hibernat+icefaces

然后自己写Daobase,在daoImpl 调用daobase 抛出异常collection with two open sessions 异常,郁闷了很久,在网络上看了很多文章,依然不得解决方法,也行我还是一般水准吧。

无意中在JavaEye 看大家对daobase 的讨论得出可能是我daobase的问题,修改后竟然OK

贴出daobase方法:

在保存实体的时候由于有关联关系,分别调用了下面2个方法

/**保存单个对象
*/
public void saveObject(Object obj){
getHibernateTemplate().save(obj);
}

/**查找对象,参数类名和map 返回List ,map可以是表的任何字段。
*/
public List findObjectSingle(Object obj, Map<String,Object> map){
Iterator it = map.entrySet().iterator();
StringBuffer sql = new StringBuffer();
while(it.hasNext()){
Map.Entry entry = (Map.Entry)it.next();
String key = entry.getKey().toString();
String val = entry.getValue().toString();
sql.append(" and " + key + "='" + val + "'");
}

return (List) getSession().createQuery("from "+obj.toString()+" where 1=1 "+ sql );
}

//后来修改成:
public List findObjectSingle(Object obj, Map<String,Object> map){
Session session = this.getSession();
Iterator it = map.entrySet().iterator();
StringBuffer sql = new StringBuffer();
while(it.hasNext()){
Map.Entry entry = (Map.Entry)it.next();
String key = entry.getKey().toString();
String val = entry.getValue().toString();
sql.append(" and " + key + "='" + val + "'");
}
List list = (List)session.createQuery("from "+obj.toString()+" where 1=1 "+ sql ).list();
session.flush();
session.close();
return list;
}
//或:
public List findObjectSingle(Object obj, Map<String,Object> map){
Iterator it = map.entrySet().iterator();
StringBuffer sql = new StringBuffer();
while(it.hasNext()){
Map.Entry entry = (Map.Entry)it.next();
String key = entry.getKey().toString();
String val = entry.getValue().toString();
sql.append(" and " + key + "='" + val + "'");
}
return (List) getHibernateTemplate().find("from " +obj.toString()+" where 1=1 "+ sql);
}
//OK,原因是程序开启了2个Session 所以报错!!!

我的配置类似:[url]http://www.blogjava.net/Sunday/archive/2007/08/28/140593.html[/url]中的第2中方式
参考帖子:
1:[url]http://www.blogjava.net/Sunday/archive/2007/08/28/140593.html[/url]
2:[url]http://www.iteye.com/post/240511?page=1[/url]
3:[url]http://www.iteye.com/topic/15359 [/url]此处我的工程没有设置filter
4:[url]http://www.iteye.com/topic/8224?page=1 [/url]看此贴想出了解决方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值