hibernate异常处理
Hibernate 常见异常处理2009-12-28 18:25
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 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" 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-----------------------------------------------
save the transient instance before flushing
1.
(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
因为配置文件中的一个 <many-to-one name="person" ../> 中的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():
异常原因:
<id>元素配置不正确,
<id>元素缺少其子元素<generator></generator>的配置。
解决方法:<id>元素映射了相应数据库表的主键字段,对其子元素<generator ref="sessionFactory"/>
</bean>
<bean id="urlMapping"
ref="openSessionInViewInterceptor"/>
<property name="mappings">
<props>
......
</props>
</property>
</bean>
2. Filter
<web-app>
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
</web-app>
第2种解决方法:
Hibernate.initialize()强制加载关联对象
---------------------------------------16----------------------------------------------
Hibernate的No CurrentSessionContext configured 解决方案
Hibernate No CurrentSessionContext configured!
当你使用 Hibernate session factory的getCurrentSession() 函数时候,你可能见到过"No
CurrentSessionContext configured!"
出现这个问题,是因为你没有正确配置 Hibernate internal session context management .
你只要在Hibernate.cfg.xml文件中添加下面的配置就可以了:
<property name="current_session_context_class">thread</property>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^
hibernate实现类中的方法2009-02-22 12:52--增加
public void addUser(User user){
Session s=null;
Transation tx=null;
try{
s=HibernateUtil.getSession();//在HibernateUtil工具类中写的
tx=s.beginTransation();
s.save(user);//要是删除操作就改成s.delete(user);要是更新:s.update(user);
tx.commit();
}catch(hibernateException e){
if(tx!=null){tx.rollback();}
trow e;
}finally{
if(s!=null){s.close();}
}
}