hibernate跟spring整合中session管理的问题
我做的有几个模块,用户管理和模块的管理,在用户管理中并没有出现关于session异常的现象,可是在做模块管理的时候却出现了异常,代码都类似,后来在百度搜好像是关于session的线程管理问题,我的web.xml中已经配置:
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
DAO类中的代码如下:
public void delModule(int moduleId) {
Module module = findById(moduleId);
if(module.getChildren().size()>0)
{
throw new RuntimeException("模块【"+module.getName()+"】存在有子模块,不允许删除");
}
getHibernateTemplate().delete(module);
}
public Module findModule(int moduleId) {
Session session = this.getSession();
Query query = session.createQuery("from Module as m where m.id="+moduleId);
return (Module)query.uniqueResult();
}
public Module findById(int moduleId)
{
Module module=(Module)getHibernateTemplate().load(Module.class, moduleId);
return module;
}
在delModule中,我分别调用findModule(int moduleId),和findById(int moduleId)获取module对象,可是调用时出现的错误分别是:
2009-5-24 12:06:03 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
at org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:410)
at org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:43)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61)
at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55)
at org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:123)
at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:101)
at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:52)
at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:766)
at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:744)
at org.springframework.orm.hibernate3.HibernateTemplate$25.doInHibernate(HibernateTemplate.java:848)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:842)
at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:838)
at org.myy.manager.impl.ModuleManager.delModule(ModuleManager.java:27)
at org.myy.action.ModuleManagerAction.delMod(ModuleManagerAction.java:143)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
...
和
12:08:31,361 ERROR LazyInitializationException:19 - could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
at org.myy.model.Module$$EnhancerByCGLIB$$dcd743d6.getChildren(<generated>)
at org.myy.manager.impl.ModuleManager.delModule(ModuleManager.java:22)
at org.myy.action.ModuleManagerAction.delMod(ModuleManagerAction.java:143)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
...
这个问题该怎么解决啊,急求各位大侠解决..
[解决办法]
session没有及时关闭掉。。。
[解决办法]
你的Spring是如何挂入Web的?是通过web.xml的监听器?还是通过struts的插件。
在实际工作经验中,我发现,如果你是通过struts的插件集成的Spring,而不是通过在web.xml中配置监听器,那么你写的可以解决延迟载问题的过滤器就不会起作用。你必须通过web.xml配置监听器的方式来加载Spring,那个解决延迟加载问题的过滤器才能起作用。
另外,如果你是使用Eclipse进行集成的话,那Eclipse有一个小bug,它会将asm.jar与asm.2.2.3.jar同时发布到服务器上面你的项目中的lib目录下,而这两个jar里的包名与类名是完全一样的,只是版本不一样,在实际运行中会产生严重冲突,造成你的程序无法正常工作,建议直接到tomcat下面,你项目中的lib目录中,删除asm2.2.3.jar,然后重启你的tomcat(注意,只能重启,不能重发布,因为重发布,jar包又出来了)。
你试试,不知道能不能解决你的问题。
[解决办法]
public Module findModule(int moduleId) {
Session session = this.getSession();
Query query = session.createQuery("from Module as m where m.id="+moduleId);
return (Module)query.uniqueResult();
}
应该修改成。
- Java code
return this.getHibernateTemplate().execute(new HibernateCallback() { @Override public Module doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery("from Module as m where m.id="+moduleId); return (Module)query.uniqueResult(); } });
[解决办法]
"清华大学软件学院"那哥们你用ejb干嘛
添乱是吧??
[解决办法]
在web.xml里加上 spring -> filter模板
<filter>
<filter-name>DelegatingFilterProxy</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>