vickzhu

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            151 隨筆 :: 0 文章 :: 34 評(píng)論 :: 0 Trackbacks

                  今天又測(cè)試了一下搭建了一下SSH框架,但是出了一個(gè)問(wèn)題,當(dāng)我用get()加載一個(gè)對(duì)象的時(shí)候沒(méi)有異常,但是用load()的時(shí)候拋出了異常,異常如下:
          java.lang.NullPointerException
           at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)
           at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121)
           at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232)
           at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173)
           at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
           at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
           at org.hibernate.impl.SessionImpl.load(SessionImpl.java:781)
           at org.hibernate.impl.SessionImpl.load(SessionImpl.java:774)
           at org.springframework.orm.hibernate3.HibernateTemplate$3.doInHibernate(HibernateTemplate.java:508)
           at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
           at org.springframework.orm.hibernate3.HibernateTemplate.load(HibernateTemplate.java:502)
           at org.springframework.orm.hibernate3.HibernateTemplate.load(HibernateTemplate.java:496)
           at com.bestone.SSH.hibernate.LawUserDAO.findByName(LawUserDAO.java:104)
           at com.bestone.SSH.service.impl.LoginServiceImpl.checkLogin(LoginServiceImpl.java:30)
           at com.bestone.SSH.struts.action.LoginAction.execute(LoginAction.java:63)
           at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110)
           at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
           at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
           at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
           at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
           at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
           at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
           at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
           at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
           at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
           at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
           at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
           at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
           at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
           at java.lang.Thread.run(Thread.java:619)

                  碰到這個(gè)問(wèn)題,我馬上想到了加載數(shù)據(jù)時(shí)load和get的區(qū)別:
                  1、load總是假定要查詢的數(shù)據(jù)存在,如果未能發(fā)現(xiàn)符合條件的記錄,get方法返回null,而load方法會(huì)拋出一個(gè)ObjectNotFoundException。
                  2、load方法返回實(shí)體的代理實(shí)例,而get方法永遠(yuǎn)直接返回實(shí)體類。
                  3、load方法可以充分的利用一級(jí)緩存和二級(jí)緩存中的數(shù)據(jù),而get方法則僅僅在一級(jí)緩存中進(jìn)行數(shù)據(jù)查找,如果沒(méi)有發(fā)現(xiàn)對(duì)應(yīng)的數(shù)據(jù),將越過(guò)二級(jí)緩存,直接調(diào)用sql完成數(shù)據(jù)讀取(經(jīng)過(guò)我的證實(shí),在hibernate3.2中g(shù)et()方法是可以查找二級(jí)緩存的)。
                  仔細(xì)看了看錯(cuò)誤,想來(lái)想去應(yīng)該是生成代理類的時(shí)候出現(xiàn)了錯(cuò)誤。java中生成代理類有兩種形式,一是java動(dòng)態(tài)代理,二是利用cglib生成。而hibernate中實(shí)體的代理類是用cglib生成的。
                  后來(lái)仔細(xì)研究了一下jar包,通過(guò)jar包源碼發(fā)現(xiàn),原來(lái)是cglib-2.1.3.jar和cglib-nodep-2.1_3.jar相沖突,只需要把cglib-2.1.3.jar包刪除就沒(méi)有問(wèn)題了。查看cglib-nodep-2.1_3.jar的源碼我們還發(fā)現(xiàn)一個(gè)問(wèn)題,它包含了asm-attrs.jar的全部類,但是使用的包名不同,不知道有沒(méi)有沖突,運(yùn)行程序查看日志,暫時(shí)沒(méi)有發(fā)現(xiàn)什么問(wèn)題,就留著asm-attrs.jar吧。
                  
          posted on 2008-10-22 17:36 筱 筱 閱讀(1002) 評(píng)論(2)  編輯  收藏

          評(píng)論

          # re: org.hibernate.tuple.AbstractEntityTuplizer.createProxy 2009-11-13 13:24 half_moon
          不錯(cuò),很詳細(xì),感謝!  回復(fù)  更多評(píng)論
            

          # re: org.hibernate.tuple.AbstractEntityTuplizer.createProxy 2010-06-20 21:11 侯瓊
          @half_moon
          非常感謝  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 天柱县| 柳河县| 江都市| 如皋市| 礼泉县| 庆元县| 辰溪县| 兴安盟| 青阳县| 高安市| 灵山县| 新龙县| 会宁县| 五大连池市| 霍州市| 扎囊县| 炎陵县| 双鸭山市| 四平市| 宜良县| 中牟县| 治县。| 大名县| 美姑县| 临江市| 丹寨县| 偏关县| 三原县| 仙游县| 南部县| 讷河市| 邛崃市| 新巴尔虎左旗| 元阳县| 姜堰市| 莱阳市| 桃源县| 揭阳市| 鹤峰县| 大足县| 桂平市|