现在的位置: 首页 > 综合 > 正文

Hibernate 常见异常处理

2013年09月26日 ⁄ 综合 ⁄ 共 8094字 ⁄ 字号 评论关闭

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():异常时,一般是因为<id>元素配置不正确,<id>元素缺少其子元素<generator></generator>的配置引起。

       解决方案:<id>元素映射了相应数据库表的主键字段,对其子元素<generator class="">,其中class
的取值可以为increment、identity、sequence、hilo、native……等,更多的可参考hibernate参考文档,一般取其值为native 。具体可参考2.2.2.1小节。

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();得当前Session

5. 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这样的信息。

       针对上面的各种原因,开发人员可以找出对应的解决方案。
 

16.net.sf.hibernate.QueryException: undefined alias:我猜想出项这种错误的原因有很多种:可能是大小写问题,还有其他很多种可能 
17.net.sf.hibernate.NonUniqueResultException:检索单个对象时,查询结果包含多个对象,但没有调用

setMaxResult(1)方法
18.net.sf.hibernate.QueryException: Not all named parameters have been set
使用setProperties()方法:用于把命名参数与一个对象的属性值绑定时,对象中没有匹配的名字相同的属
性。

文章出处:http://www.diybl.com/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文件放在与你的类文件同个目录下,

本文中是放在hibernate/classes/hibernate/目录下,也就是跟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文件时,突然发神经,想写得比较国际化一点,这样写的:

   <formset language="zh" country="CN"> <!--这个是zh_CN的-->

   开始是一点问题都没有,因为我们大家一般都用中文系统,后来有一天我用linux,当时环境是english,

结果发现页面就报错:No form found under 'loginForm' in locale 'en_US'。

当时,特别郁闷,后来仔细回忆,想起当时只在validation.xml文件里显式的写过国际化相关的东西,后来

就把 language="zh" country="CN" 给删掉了。即:
<formset>。。。。。。</formset>

再用英文系统访问就没有事情了,看来你要是想国际化,就把所有的情况的配置都写全了,不要只指定中文

的配置,英文的不配置,那样,别人用英文系统的人就会出错。所以,建议还是不要制定国际化,看来有的

时候还是偷懒一点比较好!

===========================

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.NoSuchMethodError

java.lang.Object

   |

   +----java.lang.Throwable

           |

           +----java.lang.Error

                   |

                   +----java.lang.LinkageError

                           |

                           +----java.lang.IncompatibleClassChangeError

                                   |

                                   +----java.lang.NoSuchMethodError

public class NoSuchMethodError

extends IncompatibleClassChangeError

如果应用程序试图调用一个类的指定方法(无论是静态还是动态),但是该类不再有该方法的定义,则抛出该

异常。

通常由编译器检测此错误;如果类定义不允许再作兼容性的改变,那么此错误只可能发生在运行时刻。

构造子索引

NoSuchMethodError()

NoSuchMethodError(String)

    用指定的详细信息构造 NoSuchMethodException。 

构造子

NoSuchMethodError

public NoSuchMethodError()

NoSuchMethodError

public NoSuchMethodError(String s)

    用指定的详细信息构造 NoSuchMethodException。

    参数:

        s - 详细信息。 

----------------------------------3--------------------------------------------------

今天用hibernate3做关系映射,当调用映射类的时候总是报

org.hibernate.LazyInitializationException: could not initialize proxy错误

原因:

hb3对many-to-one的默认处理是lazy = "proxy" 而hb2是false

所以,要这么设置

        <many-to-one name="shop_type" column="sort_id" class="liubi.ShopType"

cascade="all" outer-join="true" lazy="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文件的问题,例如<logic:iterate>会指定一个id值,

然后在循环里<bean:write>使用这个值作为name的值,如果这两个值不同,

也会出现此异常。(都是一个道理,request里没有对应的对象。)

4.这个情况比较特殊,应该算没有把STRUTS标记库的机制搞明白,

<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>

如果没有在头声明这个就用logic:iterate标记,

在bean:write的时候就会出异常!

---------------------------------6----------------------------------------------------

HibernateException: Not able to obtain connection

org.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 stream

org.dom4j.DocumentException: xxxxx(系统找不到指定的文件。) Nested exception: xxxx

org.hibernate.MappingException: Error reading resource: xxxx

这个异常主要出现的情况有:

(1)没有映射文件,也就是没有xxx.hbm.xml

(2)在xxx.hbm.xml文件中有错误,主要可能是书写错误,或有乱码

(3) 这个问题最恶心,一般人不会注意到,就是要注意配置文件和映射文件都必须用同一个版本的HIBERNATE

,怎么看是否用同一个HIBERNATE呢,你可以查看hibernate.cfg.xml和xxx.hbm.xml开头内容:

例如

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

如果一个是2.0一个是3.0到时候DOM4J就会出异常。解析不了咯!

---------------------------------------8-----------------------------------------------

抱歉!评论已关闭.