vickzhu

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  151 随笔 :: 0 文章 :: 34 评论 :: 0 Trackbacks

        今天又测试了一下搭建了一下SSH框架,但是出了一个问题,当我用get()加载一个对象的时候没有异常,但是用load()的时候抛出了异常,异常如下:
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)

        碰到这个问题,我马上想到了加载数据时load和get的区别:
        1、load总是假定要查询的数据存在,如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。
        2、load方法返回实体的代理实例,而get方法永远直接返回实体类。
        3、load方法可以充分的利用一级缓存和二级缓存中的数据,而get方法则仅仅在一级缓存中进行数据查找,如果没有发现对应的数据,将越过二级缓存,直接调用sql完成数据读取(经过我的证实,在hibernate3.2中get()方法是可以查找二级缓存的)。
        仔细看了看错误,想来想去应该是生成代理类的时候出现了错误。java中生成代理类有两种形式,一是java动态代理,二是利用cglib生成。而hibernate中实体的代理类是用cglib生成的。
        后来仔细研究了一下jar包,通过jar包源码发现,原来是cglib-2.1.3.jar和cglib-nodep-2.1_3.jar相冲突,只需要把cglib-2.1.3.jar包删除就没有问题了。查看cglib-nodep-2.1_3.jar的源码我们还发现一个问题,它包含了asm-attrs.jar的全部类,但是使用的包名不同,不知道有没有冲突,运行程序查看日志,暂时没有发现什么问题,就留着asm-attrs.jar吧。
        
posted on 2008-10-22 17:36 筱 筱 阅读(991) 评论(2)  编辑  收藏

评论

# re: org.hibernate.tuple.AbstractEntityTuplizer.createProxy 2009-11-13 13:24 half_moon
不错,很详细,感谢!  回复  更多评论
  

# re: org.hibernate.tuple.AbstractEntityTuplizer.createProxy 2010-06-20 21:11 侯琼
@half_moon
非常感谢  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: