




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Hibernate 常见异常net.sf.hibernate.MappingException 当出现net.sf.hibernate.MappingException: Error reading resource:异常时一般是因为映射文件出现错误。 当出现net.sf.hibernate.MappingException: Resource: not found是因为XML配置文件没找到所致,有可能是放置目录不正确,或者没将其加入hibernate.cfg.xml中。2. net.sf.hibernate.PropertyNotFoundException 当出现net.sf.hibernate.PropertyNotFoundException: Could not find a setter for property name in class 时,原因一般是因为XML映射文件中的属性与对应的Java类中的属性的getter或setter方法不一致。3. org.hibernate.id.IdentifierGenerationException 当出现org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save():异常时,一般是因为元素配置不正确,元素缺少其子元素的配置引起。 解决方案:元素映射了相应数据库表的主键字段,对其子元素,其中class的取值可以为increment、identity、sequence、hilo、native等,更多的可参考hibernate参考文档,一般取其值为native 。具体可参考小节。4. a different object with the same identifier value was already associated with the session 当出现a different object with the same identifier value was already associated with the session时,一般是因为在hibernate中同一个session里面有了两个相同标识但是是不同实体。 有如下几种解决方案:(1)使用session.clean(),如果在clean操作后面又进行了saveOrUpdate(object)等改变数据状态的操作,有可能会报出Found two representations of same collection异常。(2)使用session.refresh(object),当object不是数据库中已有数据的对象的时候,不能使用session.refresh(object)因为该方法是从hibernate的session中去重新取object,如果session中没有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判断一下。(3)session.merge(object),Hibernate里面自带的方法,推荐使用。再次碰到:a different object with the same identifier value was already associated with the session这个错误我一共遇到过两次,一直没有找到很好的解决方案,这个错误产生原因相信大家都知道,因为在hibernate中同一个session里面有了两个相同标识但是是不同实体.一开始按网上说的用session.merge(Object)报了一个错,可能是没有用好,改用 session.clear(); session.update(user);这样就OK了,方法为:package org.springframework.orm.hibernate3.support;. public void modifyByMerge(User user) Session session = getHibernateTemplate().getSessionFactory(). getCurrentSession(); session.clear(); session.update(user); .项目用的是spring + hibernate所以得用getHibernateTemplate().getSessionFactory().getCurrentSession();得当前Session5. SQL Grammer Exception,Could not execute JDBC batch update 当出现SQL Grammer Exception,Could not execute JDBC batch update异常时,一般是由如下问题引起:(1)SQL语句中存在语法错误或是传入的数据有误;(2)数据库的配置不合法,或者说是配置有误。较容易出现的有数据表的映射文件(,hbm.xml文件)配置有误;Hibernate.cfg.xml文件配置有误;(3) 当前的数据库用户权限不足,不能操作数据库。以是以Oracle 数据库为例,这种情况下在错误提示中会显示java.sql.BatchUpdateException: ORA-01031: insufficient privileges这样的信息。 针对上面的各种原因,开发人员可以找出对应的解决方案。16net.sf.hibernate.QueryException: undefined alias:我猜想出项这种错误的原因有很多种:可能是大小写问题,还有其他很多种可能 17net.sf.hibernate.NonUniqueResultException:检索单个对象时,查询结果包含多个对象,但没有调用setMaxResult(1)方法18net.sf.hibernate.QueryException: Not all named parameters have been set使用setProperties()方法:用于把命名参数与一个对象的属性值绑定时,对象中没有匹配的名字相同的属性。文章出处:/course/3_program/java/javashl/2008410/108844_2.html=1 Caused by: org.dom4j.DocumentException: Invalid byte 2 of 2-byte UTF-8 sequence. Nested exception: Invalid byte 2 of 2-byte UTF-8 sequence. 如果出现这行错误说明你的XML配置文件有不规范的字符,检查下。 2 net.sf.hibernate.MappingException: Error reading resource: hibernate/Hello_Bean.hbm.xml 如果出现这行错误说明你的hibernate的XML配置文件有错 3 net.sf.hibernate.MappingException: Resource: hibernate/Hello_Bean.hbm.xml not found 如果出现这行错误说明hibernate的XML配置文件没有找到,你应该把XML文件放在与你的类文件同个目录下,本文中是放在hibernateclasseshibernate目录下,也就是跟Hello_Bean.class类文件一起。 4 net.sf.hibernate.PropertyNotFoundException: Could not find a setter for property name in class hibernate.Hello_Bean 如果出现这行错误说明你的xml文件里设置的字段名name的值与Hello_Bean.Java类里的getXXX或setXXX方法不一致。 5 net.sf.hibernate.HibernateException: JDBC Driver class not found: org.gjt.mm.mysql.Driver 6.The database returned no natively generated identity value 。 主键没有添加增量 =Exception : No form found under loginForm in locale en_US这个错误完全是我自己给自己找麻烦,我在给loginForm做表单验证时,用了validator,我在写validation.xml文件时,突然发神经,想写得比较国际化一点,这样写的: 开始是一点问题都没有,因为我们大家一般都用中文系统,后来有一天我用linux,当时环境是english,结果发现页面就报错:No form found under loginForm in locale en_US。当时,特别郁闷,后来仔细回忆,想起当时只在validation.xml文件里显式的写过国际化相关的东西,后来就把 language=zh country=CN 给删掉了。即:。再用英文系统访问就没有事情了,看来你要是想国际化,就把所有的情况的配置都写全了,不要只指定中文的配置,英文的不配置,那样,别人用英文系统的人就会出错。所以,建议还是不要制定国际化,看来有的时候还是偷懒一点比较好!=Hibernate错误:org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1 原因多半是你的mapping文件的主键没有设置对。检查如下:一:看你的主键类型是什么?如果是long,int等,记得设置unsaved-value=0二:如果是string 的话,请设置unsaved-value=null注意unsaved-value是个很重要的属性。Hibernate通过这个属性来判断一个对象应该save还是update,如果这个对象的id是unsaved-value的话,那说明这个对象不是 persistence object要save(insert);如果id是非unsaved-value的话,那说明这个对象是persistence object(数据库中已存在),只要update就行了。 你可以Debug跟一下你的代码,看看在 session.update(obj); 的时候,obj的主键的值是不是按你定义的那样,obj可以被hibernate认为是一个已经持久化在数据库里的对象 =java.lang.NoClassDefFoundError: antlr/ANTLRException原因是:缺少antlr-2.7.5H3.jar-2-类 java.lang.NoSuchMethodErrorjava.lang.Object | +-java.lang.Throwable | +-java.lang.Error | +-java.lang.LinkageError | +-java.lang.IncompatibleClassChangeError | +-java.lang.NoSuchMethodErrorpublic class NoSuchMethodErrorextends IncompatibleClassChangeError如果应用程序试图调用一个类的指定方法(无论是静态还是动态),但是该类不再有该方法的定义,则抛出该异常。通常由编译器检测此错误;如果类定义不允许再作兼容性的改变,那么此错误只可能发生在运行时刻。构造子索引NoSuchMethodError()NoSuchMethodError(String) 用指定的详细信息构造 NoSuchMethodException。 构造子NoSuchMethodErrorpublic NoSuchMethodError()NoSuchMethodErrorpublic NoSuchMethodError(String s) 用指定的详细信息构造 NoSuchMethodException。 参数: s - 详细信息。 -3-今天用hibernate3做关系映射,当调用映射类的时候总是报org.hibernate.LazyInitializationException: could not initialize proxy错误原因:hb3对many-to-one的默认处理是lazy = proxy 而hb2是false所以,要这么设置 -4-java.sql.Timestamp异常 原因:时间date错误 更改时间java.util.Date 为java.lang.String就好了,同时修改配置文件中的内容-5-Cannot find bean in any scope分类:Struts异常1.出现这种错误一般是资源文件没找到或是资源文件里没有对应的key值。2.struts-config.xml里的Action配置里把redirect设置为了true;改成false,3.在Action里一般会request.setAttribute()一些对象,然后在转向的jsp文件里(用tag或 request.getAttribute()方法)得到这些对象并显示出来。这个异常是说jsp要得到一个对象,但前面的Action里并没有将对象设置到request(也可以是session、servletContext)里。可能是名字错了,请检查jsp里的tag的一般是name属性,或getAttribute()方法的参数值;或者是Action逻辑有问题没有执行setAttribute()方法就先转向了。还有另外一个可能,纯粹是jsp文件的问题,例如会指定一个id值,然后在循环里使用这个值作为name的值,如果这两个值不同,也会出现此异常。(都是一个道理,request里没有对应的对象。)4.这个情况比较特殊,应该算没有把STRUTS标记库的机制搞明白,如果没有在头声明这个就用logic:iterate标记,在bean:write的时候就会出异常!-6-HibernateException: Not able to obtain connectionorg.hibernate.HibernateException: Not able to obtain connection差不多等于没有连接数据库了。要保证Hibernate的Session工厂能正常工作。这个一般我们的做法是Session工厂设置成静态的。然后需要进行操作就打开一个会话。所以在设计的时候注意一下。这个Session工厂对象。最好是放在static块里。然后用个抽象类去实现它,然后其他的类都实现这个抽象类就搞定了!-7-org.hibernate.MappingException: Error reading resource: XXXX.XML这个异常出现的报错还有:Could not configure datastore from input streamorg.dom4j.DocumentException: xxxxx(系统找不到指定的文件。) Nested exception: xxxxorg.hibernate.MappingException: Error reading resource: xxxx这个异常主要出现的情况有:(1)没有映射文件,也就是没有xxx.hbm.xml(2)在xxx.hbm.xml文件中有错误,主要可能是书写错误,或有乱码(3) 这个问题最恶心,一般人不会注意到,就是要注意配置文件和映射文件都必须用同一个版本的HIBERNATE,怎么看是否用同一个HIBERNATE呢,你可以查看hibernate.cfg.xml和xxx.hbm.xml开头内容:例如如果一个是2.0一个是3.0到时候DOM4J就会出异常。解析不了咯!-8-save the transient instance before flushing1.(1)做Hibernate多对一的时候,报错:org.apache.jasper.JasperException: Error creating bean with name sf defined in ServletContext resource /WEB-INF/applicationContext.xml: Initialization of bean failed; nested exception is org.hibernate.PropertyNotFoundException: Could not find a getter for person in class com.accp.vo.Course因为配置文件中的一个 中的person属性名称写错了.还有原因如下: 1)getter()方法写错了,没有按照javaBean的规则写. 2)*.hmb.xml中的属性名和pojo中的是否一致.注意:属性名是否多了空格.(2).Hibernate多对一报错:save the transient instance before flushing具体错误为在one-to-many中,对many进行save时,由于没有加入one的外建,导致错误。具体解决方法:(1)、在one的hbm文件中 invest=true(2)、在many保存前务必要求one的存在-9-Named query not known在使用session.getNamedQuery(XXX);执行HQL语句的时候,没有找 XXX语句,这主要是2个原因1:粗心,把名给写错了2:XXX的HQL语句所在的.hbm.xml没有在hibernate.cfg.xml里注册过!-10-Expected positional parameter count: X, actual parameters: org.hibernate.QueryException: Expected positional parameter count: 2, actual parameters: SELECT * from Ad where gr_id = ? and adst_id = ?这样的异常主要原因是:/以下为例子Query query =session.getNamedQuery(OnlienAd); query.setParameter(0,gray.getId(); query.setParameter(1,Globals.UPED_STATE);可以看到query.setParameter()设置了位,也可以理解成他在要执行的HQL语句中占了2个位置。然后执行的时候会对应HQL里的?中去。如果你并没有setParameter(),但你的HQL里却有?那么就会出这个异常。 -11-org.hibernate.MappingException: Association references:XXX-12-org.hibernate.exception.SQLGrammarException: could not initialize无法实例集合。这个是问题在你当前的实体中有一个一对多需实例的对象。但这个对象却无法实例出来,说明一对多那个多的一方实体有问题,多数情况可能有:1、数据库该动过但代码没动2、实体代码有错误-13-org.hibernate.id.IdentifierGenerationException异常信息:org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save():异常原因:元素配置不正确,元素缺少其子元素的配置。解决方法:元素映射了相应数据库表的主键字段,对其子元素,其中class的取值可以为increment、identity、sequence、hilo、native. 等,更多的可参考hibernate参考文档,一般取其值为native 。MySQL:identity,increment,hilo,native.SQL Server:identity,increment,hilo,native.Oracle:sequence,seqhilo,increment,native.跨平台开发:native.native将字段管理交给数据库自己定义。-8-not-null property references a null or transient value此异常出现看开头就个单词就知道啦的实体约束不能为空却为空造成的,那我在这说一下对于这样的情况我们时常犯的错误。我们在对实体进行更新操作时最好是在一个会话中将数据从数据库中调出并实例BEAN的对象。然后再对此对象进行更改后在更新。这样的好处是:一、数据是最新鲜的。二、避免不必要的设置,特别是在一对多和多对多的情况下,比如你现在操作的实体并不是在一个会话中得到,而是保存在某些容器中,比如jsp的 SESSION中,虽然这样的实体对象中有很多数据,但是如果你想得到这些实体对应的1对多或多对1的实体时,就会发现会出现session已经关闭的异常。或则在你更新数据时出现not-null异常等。-14-Remember that ordinal parameters are 1-based!HQL语句有错误-15-failed to lazily initialize a collection of role: XXXXXXXX no session or这个异常大致意思是说在多对一的时候(并且lazy=false),对象的实例失败,多数出现的情况有1、粗心造成实例对象类名写错之类的2、逻辑错误如之前就已经传递过来一个实体对象,然后调用实体对象的方法时牵涉到1对多的情况,但此时SESSION已经关闭,所以根本无法进行一对多的操作。3、设计到跨度的问题:这样打比方有多个实体对象,他们直接或则间接的有关联。比如有4个实体,分别是广告信息、广告、广告问答题、广告商:他们之间的关系为:广告商 1:n 广告广告 1:n 广告问答题广告商 1:n 广告商信息大家可以看到广告和广告商信息是没有直接关系的。但我要添加广告的时候我就必须将广告商的实体做为条件。那么这么一来广告商信息可能间接的就必须用上。下面看我的操作:ad(广告),subject(题目) Ad ad = new Ad(); ad.setAdProd(adform.getAdProd(); ad.setIndustry(industry); ad.setAdPicture(pagefile.getFileName(); ad.setAdFlack(adform.getAdFlack(); ad.setAdDv(dvfile.getFileName(); ad.setAdContent(adform.getAdContent(); ad.setGray(gray); ad.setAdDate(new Date(); ad.setOnlinetime(new Long(0); /以上为广告的基本信息填写,而重要的是看下面一句,在这里我的思路是subjectFormList是一个动态提交的表单,里面有若干个广告问答题。我将这些问答题变为一个Set,然后作为ad的一个属性。 Set subjectset=getSubjectSet(subjectFormList,ad); ad.setSubjects(subjectset);/然后提交,makePersistent是一个封装的方法,用途就是save()啦。addao是一个DAO,里面有ADUS。addao.makePersistent(ad);表面上看来很符合逻辑,只要我们在ad的映射里面加上对subject的级联更新就可以完成这项操作。但实际上会发生我们意想不到的问题,来让我们看一下getSubjectSet()的内容:public Set getSubjectSet(List subjectlist,Ad ad) Set set=new HashSet(0); Subject subject; for(Iterator it=subjectlist.iterator();it.hasNext();) subject=new Subject(); SubjectForm sf=it.next(); subject.setSuContent(sf.getSucontent(); subject.setSuOption(sf.getSuoption(); subject.setSuResult(Arrays.deepToString(sf.getSuresult(); subject.setSuType(String.valueOf(sf.getSutype(); subject.setAd(ad); set.add(subject); return set;我们在这个方法上设一个断点然后跟踪,之后你会发现断点在set.add(subject)只后就会出failed to lazily initialize a collection of role: XXXXXXXX no session or session was closed这个异常,并且这个异常还是出在了广告商的广告信息上 gray.messages。是不是很不可理解?这也是Hibernate的懒汉机制问题。没有任何一样技术是完美的。那我们该怎么处理这样的问题。有很多人以为我们在广告商对广告商信息的隐射上加lazy=false这样在对gray操作会对messages进行关联,并查询时提出数据。但你会发现改完之后会出现org.hibernate.LazyInitializationException: illegal access to loading collection这个异常。并切lazy=false是我们不推荐的一种方法。他会降低你的查询效率。对于这样的情况最好的解决办法就是不要偷懒,对一个实体进行操作的时候就该用那个实体的DAO,即应该有2句HQL。如下把getSubjectSet()改一改:public void getSubjectSet(List subjectlist,Ad ad) Set set=new HashSet(0); SubjectDAO subjectdao=DAOFactory.getDao(SubjectDAO.class); for(Iterator it=subjectlist.iterator();it.hasNext();) Subject subject=new Subject(); SubjectForm sf=it.next(); subject.setSuContent(sf.getSucontent(); subject.setSuOption(s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030止泻药行业风险投资态势及投融资策略指引报告
- 2025-2030住房租赁立法进程对青年公寓行业规范化影响报告
- 2025-2030二手房翻新市场带动免漆门二次消费潜力报告
- 2025-2030中国高端公寓家政服务标准化与利润增长点分析报告
- 2025-2030中国青年公寓市场政策支持与行业规范发展报告
- 2025-2030中国青年公寓家电租赁服务市场可行性分析报告
- 四川省自贡市富顺第三中学2026届英语九上期末联考模拟试题含解析
- 2026届北京市北京理工大附中化学九上期末检测试题含解析
- 2026届宣城市重点中学化学九上期中质量检测模拟试题含解析
- 2026届湖南省邵阳市名校英语九年级第一学期期末预测试题含解析
- 《进一步规范管理燃煤自备电厂工作方案》发改体改〔2021〕1624号
- 学生手册超级题库
- 现金收付业务管理办法
- 《多元统计分析-基于R(第3版)》课件全套 费宇 第1-13章-多元统计分析与R简介-多维标度分析
- 输变电工程施工质量验收统一表式附件1:线路工程填写示例
- 人音版小学六年级上册音乐教案 全册
- DLT 5630-2021 输变电工程防灾减灾设计规程-PDF解密
- 【川教版】《生命 生态 安全》二年级上册第3课 我的鸡蛋宝宝 课件
- 幼儿园小班语言《想长脚的石头》
- 模板安装三检记录表
- 哈弗F5汽车说明书
评论
0/150
提交评论