Dao和Service都用了基类,非通用类写在专属service出错,写在action正常

问题描述

大家帮我看看我Dao和Service都用了基类,都通用的还正常,非通用类写在专属service出错,写在action正常。BarepackageUploadAction调用BarepackageServiceImpl这个类的updatePhoto(StringphotoFileName,Integerid,IntegerphotoSn)就会报错,把这个函数的内容直接写到action里就正常。错误信息:org.hibernate.HibernateException:NoSessionfoundforcurrentthreadorg.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:106)org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:990)com.nondelivery.dao.impl.BaseDaoImpl.getSession(BaseDaoImpl.java:37)com.nondelivery.dao.impl.BaseDaoImpl.findById(BaseDaoImpl.java:41)com.nondelivery.service.impl.BaseServiceImpl.findById(BaseServiceImpl.java:38)com.nondelivery.service.impl.BarepackageServiceImpl.updatePhoto(BarepackageServiceImpl.java:37)sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)java.lang.reflect.Method.invoke(Method.java:597)org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:201)$Proxy18.updatePhoto(UnknownSource)packagecom.nondelivery.action;importjava.io.*;importjava.util.Date;importorg.apache.struts2.ServletActionContext;importorg.apache.struts2.json.annotations.JSON;importorg.springframework.stereotype.Component;//importcom.google.gson.JsonArray;//importcom.google.gson.JsonObject;//importcom.google.gson.JsonElement;//importcom.google.gson.JsonPrimitive;//importcom.google.gson.JsonPrimitive;importcom.nondelivery.service.IBarepackageService;importcom.nondelivery.vo.Barepackage;importcom.opensymphony.xwork2.ActionContext;importcom.opensymphony.xwork2.ActionSupport;importcom.zym.util.StrArrayTransform;importcom.zym.util.StrInclueFixedSeparator;//importentity.Driver;//importentity.Driver;@Component("barepackageUploadAction")publicclassBarepackageUploadActionextendsActionSupport{privatestaticfinallongserialVersionUID=1L;IBarepackageServicebarepackageService;//privateBarepackagebarepackage;privateIntegerid;//邮件序号privateStringphotoSn;//照片顺序号privateStringrelativePhotoDir="uploaderphoto";privateStringfieldPhoto;//判断是否更新成功privatebooleansuccess;privateStringmsg="";privateFileupload;privateStringuploadContentType;//这里要注意一点,uploadFileName中的upload要与传入过来的File名字一样,不然获取不到文件的名字,今天就因为这里不一致,找了一上午没找到原因privateStringuploadFileName;privatestaticfinalintBUFFER_SIZE=16*1024;publicStringexecute()throwsException{Dated=newDate();//this.setUploadContentType("text/html");System.out.println("uploadFileName="+this.uploadFileName);//要上传的文件名//String[]tmpFileType1=StrArrayTransform.StringToArray(this.uploadFileName,".");StringtmpFileType=uploadFileName.substring(uploadFileName.lastIndexOf(".")+1);StringphotoFileName=this.id.toString()+"_"+this.photoSn+"."+tmpFileType;//服务器端相片文件名称,此文件名按一定次序存入数据库this.uploadFileName=photoFileName;//获得wapps的路径,uploader指的放在文件的地方StringtoSrc=ServletActionContext.getServletContext().getRealPath(relativePhotoDir)+"\"+photoFileName;System.out.println("toFile="+toSrc);FiletoFile=newFile(toSrc);this.success=writeFile(this.upload,toFile);if(this.success){barepackageService.updatePhoto(photoFileName,this.id,Integer.parseInt(this.photoSn));Barepackaget=barepackageService.findById(id);this.fieldPhoto=t.getPhoto();this.msg="照片上传成功!";}else{this.msg="照片上传失败";}returnSUCCESS;}privatestaticbooleanwriteFile(Filesrc,Filedst){System.out.println("==文件寫入==");try{InputStreamin=null;OutputStreamout=null;try{in=newBufferedInputStream(newFileInputStream(src),//获得要上传的文件BUFFER_SIZE);out=newBufferedOutputStream(newFileOutputStream(dst),//指定要上传到的位置BUFFER_SIZE);byte[]buffer=newbyte[BUFFER_SIZE];//开始写入while(in.read(buffer)>0){out.write(buffer);}}finally{if(null!=in){in.close();}if(null!=out){out.close();}}}catch(Exceptione){e.printStackTrace();returnfalse;}System.out.println("写入成功!");returntrue;}}packagecom.nondelivery.service.impl;importjava.util.List;importjavax.annotation.Resource;importorg.springframework.stereotype.Component;importorg.springframework.stereotype.Service;importcom.nondelivery.service.impl.BaseServiceImpl;importcom.nondelivery.dao.IBarepackageDao;importcom.nondelivery.dao.IBaseDao;importcom.nondelivery.dao.IUserDao;importcom.nondelivery.service.IBarepackageService;importcom.nondelivery.vo.Barepackage;importcom.zym.util.StrArrayTransform;importcom.zym.util.StrInclueFixedSeparator;@Component("barepackageService")publicclassBarepackageServiceImplextendsBaseServiceImpl<Barepackage,Integer>implementsIBarepackageService{privateIBarepackageDaobarepackageDao;@OverridepublicIBaseDao<Barepackage,Integer>getDao(){returnthis.barepackageDao;}publicIBarepackageDaogetBarepackageDao(){returnbarepackageDao;}@Resource(name="barepackageDao")publicvoidsetBarepackageDao(IBarepackageDaobarepackageDao){this.barepackageDao=barepackageDao;}publicvoidupdatePhoto(StringphotoFileName,Integerid,IntegerphotoSn){Barepackaget=findById(id);String[]strArray=StrArrayTransform.StringToArray1(StrInclueFixedSeparator.StringInclueFixedSeparator(t.getPhoto(),","),",");strArray[photoSn-1]=photoFileName;t.setPhoto(StrInclueFixedSeparator.StringInclueFixedSeparator(StrArrayTransform.arrayToString(strArray),","));update(t);}}packagecom.nondelivery.service.impl;importjava.io.Serializable;importjava.util.List;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Propagation;importorg.springframework.transaction.annotation.Transactional;importcom.nondelivery.dao.IBaseDao;importcom.nondelivery.service.IBaseService;@ServicepublicabstractclassBaseServiceImpl<T,IDextendsSerializable>implementsIBaseService<T,ID>{publicabstractIBaseDao<T,ID>getDao();public<T>voidadd(Tt){getDao().save(t);}public<T>voiddelete(Tt){getDao().delete(t);}public<T>voiddelete(IDid){getDao().delete(id);}@Transactional(readOnly=true,propagation=Propagation.REQUIRED)public<T>List<T>findAll(){List<T>list=getDao().findAll();returnlist;//returngetDao().findAll();}publicTfindById(IDid){returngetDao().findById(id);}public<T>voidupdate(Tt){getDao().update(t);}public<T>List<T>findByHql(Stringhql){returngetDao().findByHql(hql);}public<T>List<T>findByHql(Stringhql,Objectparam){returngetDao().findByHql(hql,param);}public<T>List<T>findByHql(Stringhql,Object[]params){returngetDao().findByHql(hql,params);}}packagecom.nondelivery.dao.impl;importjava.util.List;importorg.hibernate.Session;importorg.springframework.stereotype.Component;importcom.zym.util.StrArrayTransform;importcom.nondelivery.dao.impl.BaseDaoImpl;importcom.nondelivery.dao.IBarepackageDao;importcom.nondelivery.vo.Barepackage;@Component("barepackageDao")publicclassBarepackageDaoImplextendsBaseDaoImpl<Barepackage,Integer>implementsIBarepackageDao{publicBarepackageDaoImpl(){super(Barepackage.class);//TODOAuto-generatedconstructorstub}publicvoidupdatePhoto(StringphotoFileName,Integerid,IntegerphotoSn){//Barepackaget=(Barepackage)findById(id);//String[]strArray=StrArrayTransform.StringToArray(t.getPhoto(),",");//strArray[photoSn-1]=photoFileName;//t.setPhoto(StrArrayTransform.arrayToString(strArray));//this.update(t);}}packagecom.nondelivery.dao.impl;importjava.io.Serializable;importjava.util.List;importjavax.annotation.Resource;importorg.apache.commons.logging.Log;importorg.hibernate.Query;importorg.hibernate.Session;importorg.hibernate.SessionFactory;importcom.nondelivery.dao.IBaseDao;//importcom.drivers.vo.*;/****@authorZouTao**Sep3,2013*@param<T>*/publicclassBaseDaoImpl<T,IDextendsSerializable>implementsIBaseDao<T,ID>{protectedSessionFactorysessionFactory;privateClass<T>cls;publicBaseDaoImpl(Class<T>cls){this.cls=cls;}@Resource(name="sessionFactory")publicvoidsetSessionFactory(SessionFactorysessionFactory){this.sessionFactory=sessionFactory;}publicSessiongetSession(){returnthis.sessionFactory.getCurrentSession();//从3.0.1开始,hibernate增加了sessionFactory.getCurrentSession()方法,采用getCurrentSession()创建的session在commit或rollback时会自动关闭}public<T>TfindById(IDid){return(T)getSession().get(this.cls,id);}public<T>voidsave(Tt){getSession().save(t);}public<T>voidupdate(Tt){getSession().update(t);}public<T>voiddelete(Tt){getSession().delete(t);}public<T>voiddelete(IDid){getSession().delete(findById(id));}}

解决方案

解决方案二:
第一种:吧getCunrrenThread()改为openSession();第二种:配置currenThread的环境,在hibernate.cfg.xml中,加上session在上下文中取值,就行了,具体没记住,有两个取值,一个是jta范围(跨数据库平台),一个Thread_Current...忘了。应该是这个问题
解决方案三:
楼上说的很对,可我还不是很明白,也就是我的ssh知识有限不会变通。我用的是hibernate4、spring4,要不我把整个类包发给你你帮我改下,我只是想实现:BarepackageDaoImpl继承BaseDaoImpl通用方法的前提下能写自己专属的方法比如此处的updatePhoto(StringphotoFileName,Integerid,IntegerphotoSn)方法。可以吗?可以另开贴把我的所有430都给你,改好了也可以付费谢谢
解决方案四:
我用extjs4.2mvc做过一个单位项目你若需要可以拿去谢谢

时间: 2024-10-26 03:47:15

Dao和Service都用了基类,非通用类写在专属service出错,写在action正常的相关文章

c++中基类与派生类中隐含的this指针的分析

先不要看结果,看一下你是否真正了解了this指针? #include<iostream> using namespace std; class Parent{ public: int x; Parent *p; public: Parent(){} Parent(int x){ this->x=x; p=this; } virtual void f(){ cout<<"Parent::f()"<<endl; } void g(){ cout&l

ssh-SSH整合 前两个service都顺利运行就第三个出错了!为什么

问题描述 SSH整合 前两个service都顺利运行就第三个出错了!为什么 十二月 25, 2014 10:07:48 下午 org.apache.catalina.core.StandardContext listenerStart 严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener

详解C++中基类与派生类的转换以及虚基类_C 语言

C++基类与派生类的转换 在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中全部都按原样保留下来了,在派生类外可以调用基类的公用成员函数访问基类的私有成员.因此,公用派生类具有基类的全部功能,所有基类能够实现的功能, 公用派生类都能实现.而非公用派生类(私有或保护派生类)不能实现基类的全部功能(例如在派生类外不能调用基类的公用成员函数访问基类的私有成员).因此,只有公用派生类才是基类真正的

消息印射-两个MFC类实现多重继承,虚继承基类时候派生类的消息映射出错,求解决方法

问题描述 两个MFC类实现多重继承,虚继承基类时候派生类的消息映射出错,求解决方法 一个类实现了可悬浮侧靠的对话框,另一个类实现了有滑动条的对话框,然后我就想到了多重继承来实现一个可悬靠带滑动条的对话框.由于看书上说要虚继承基类,并且在初始化成员类表中显示初始化基类,这些都有做,但是在消息印射部分出了问题. 这里编辑代码不方便,详细情况在帖子中 http://bbs.csdn.net/topics/390871222 不胜感激

整个CrossApp的基类是什么类?

问题描述 整个CrossApp的基类是什么类? 解决方案 是CCObject解决方案二:好贴,绝对要支持下!!~~static/image/common/sigline.gif90%打工小伙一生都不可能知道的秘密 http://67177.miyue999.com/

详谈C++中虚基类在派生类中的内存布局_C 语言

今天重温C++的知识,当看到虚基类这点的时候,那时候也没有太过追究,就是知道虚基类是消除了类继承之间的二义性问题而已,可是很是好奇,它是怎么消除的,内存布局是怎么分配的呢?于是就深入研究了一下,具体的原理如下所示: 在C++中,obj是一个类的对象,p是指向obj的指针,该类里面有个数据成员mem,请问obj.mem和p->mem在实现和效率上有什么不同. 答案是:只有一种情况下才有重大差异,该情况必须满足以下3个条件: (1).obj 是一个虚拟继承的派生类的对象 (2).mem是从虚拟基类派

定义基类和派生类

定义基类 对于基类,我们需要记住的是作为继承关系中根节点的类通常都会定义一个虚析构函数. 基类通常都会定义一个虚析构函数,即使该函数不执行任何实际操作也是如此.   成员函数和继承 派生类可以继承其基类的成员,也可以对基类中的虚函数进行重新定义.换句话说,派生类需要对这些操作提供自己的新定义以覆盖(override)从基类继承而来的旧定义. 在C++语言中,基类必须将它的两种成员函数区分开来:一种是基类希望其派生类进行覆盖的函数:另一种是基类希望派生类直接继承而不要改变的函数.对于前者,基类通过

有关基类指针调用类的虚函数时所遇到的问题

问题描述 有关基类指针调用类的虚函数时所遇到的问题 下列输出中其中一个第2处为什么无法输出相应字符串?并且当类中的输出字符串改为输出int 类型age时又为什么可以? 问题1:问题2: 解决方案 忽视了作用域

为什么JDBC编写DAO的时候,都是每一个方法中都声明一个PreparedStatement,而不是给DAO定义一个PreparedStatement成员变量?

问题描述 如题:为什么JDBC编写DAO的时候,都是每一个方法中都声明一个PreparedStatement,而不是给DAO定义一个PreparedStatement成员变量? 解决方案 解决方案二:PreparedStatement是Connection对象创建的吧,你要是定义一个成员变量,那么你就只能公用一条Connection了,如果你在其它什么地方把Connection关闭了,那个PreparedStatement就不能用了吧解决方案三:楼上正解,我之前试过定义成员变量的,但我多次aja