`
xingerheyaolong
  • 浏览: 127786 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
文章分类
社区版块
存档分类
最新评论

使用hibernate会报异常的几种情况

阅读更多

1问:

 

Hibernate初始化时总是报错:java.lang.NoClassDefFoundErrorHibernate初始化时出现出错代码:java.lang.NoClassDefFoundError: net/sf/ehcache/CacheException

 

答:这是新手常见问题。是因为使用默认设置时,Hibernate文档里指出的Hibernate库不完整,缺少ehcache.jar(用于支持Ehcache的相关文件)。配置中加入以上文件,就可以避免初始化时出现java.lang.NoClassDefFoundError:net/sf/ehcache/CacheException异常。

----------------------------------------------------------------------------------------------------------------------

2问:

 

Hibernate报错:"Not binding factory to JNDI, no JNDI name configured"运行下列程序:public static void main(String[] args) throws Exception {      Configuration conf = new Configuration().addClass(Person.class);......出现错误码:12:15:34,250  INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI, no JNDI name configuredjava.lang.UnsupportedOperationException: The user must supply a JDBC connectionat net.sf.Hibernate.connection.UserSuppliedConnectionProvider.getConnection (UserSuppliedConnectionProvider.java:32)at net.sf.Hibernate.impl.BatcherImpl.openConnection(BatcherImpl.java:289)at net.sf.Hibernate.impl.SessionImpl.connect(SessionImpl.java:3361)at net.sf.Hibernate.impl.SessionImpl.connection(SessionImpl.java:3321)at net.sf.Hibernate.impl.BatcherImpl.prepareQueryStatement(BatcherImpl.java:66)at net.sf.Hibernate.loader.Loader.prepareQueryStatement(Loader.java:779)at net.sf.Hibernate.hql.QueryTranslator.iterate(QueryTranslator.java:864)at net.sf.Hibernate.impl.SessionImpl.iterate(SessionImpl.java:1618)at net.sf.Hibernate.impl.QueryImpl.iterate(QueryImpl.java:27)at com.Hibernate.person.TestQueryPerson.main(TestQueryPerson.java:28)Exception in thread "main"

 

答:修改main函数,为该程序指定配置文件即可。public static void main(String[] args) throws Exception {      File file=new File("./Hibernate.cfg.xml");      Configuration conf = new Configuration().configure(file);......配置文件如下。<?xml version="1.0"?><!DOCTYPE Hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://Hibernate.sourceforge.net/Hibernate-mapping-3.0.dtd"><!--   This mapping demonstrates content-based discrimination for the   table-per-hierarchy mapping strategy, using a formula   discriminator.--><Hibernate-mapping package="org.Hibernate.test.array">   <class name="A" lazy="true">     <id name="id">        <generator class="native"/>     </id>     <array name="bs" cascade="all" fetch="join">       <key column="a_id"/>       <list-index column="idx"/>        <one-to-many class="B"/>     </array>  </class>  <class name="B" lazy="true">    <id name="id">       <generator class="native"/>    </id>  </class></Hibernate-mapping>

 

----------------------------------------------------------------------------------------------------------------------

 

3问:

 

使用开发工具Elipse,运行时总报java.lang.NoClassDefFoundError: org/ Hibernate/Session异常使用Elipse,所用包是hibernte 3,发现在Action中每次执行到:session=HibernateSessionFactory.currentSession();时,出现java.lang.NoClassDefFoundError: org/Hibernate/Session异常,如下:java.lang.NoClassDefFoundError: org/Hibernate/Session           Hibernate3.Hibernate.ExcuteClass.search(ExcuteClass.java:17)           Hibernate3.Hibernate.ExcuteClass.test3(ExcuteClass.java:13)           Hibernate3.Hibernate.Svlt.doGet(Svlt.java:50)           javax.servlet.http.HttpServlet.service(HttpServlet.java:689)           javax.servlet.http.HttpServlet.service(HttpServlet.java:802)[/b]

 

答:这是初学者常见问题,原因是没有导入hibernate 3.jar包,虽然把hibernate 3.jar写入了Classpath,但部署的时候却没有拷贝到lib下面,可以手动拷贝进入。

 

----------------------------------------------------------------------------------------------------------------------

 

4问:

 

执行如下方法时,发生"No CurrentSessionContext configured"错误执行如下方法时,发生"No CurrentSessionContext configured"错误:Public static Session currentSession() {try {     System.out.println("HibernateUtil.currentSession() - start");     return getSessionFactory().getCurrentSession();} catch (HibernateException ex) {     System.out.println("HibernateUtil.currentSession() - failed due to " + ex);     throw ex;     }}

 

答:这个错误是由配置文件引起。在集成Hibernate的环境下(例如Jboss),在session-factory段加入:<property name="Hibernate.current_session_context_class">jta</property>在不集成Hibernate的环境下(例如使用JDBC的独立应用程序),在session-factory段加入:<property name="Hibernate.current_session_context_class">thread</property>就可以解决这个问题。

 

----------------------------------------------------------------------------------------------------------------------

 

5问:

 

移植Jboss 4下配置Hibernate出错在Tomcat 5下配置Hibernate成功,但移植到Jboss 4下出现了很多问题。已在deploy目录下放置了Hibernate-service.xml和Hibernate.cfg.xml文件,但启动服务器仍然报错   如下。16:56:54,046 ERROR [URLDeploymentScanner] Incomplete Deployment listing: Packages waiting for a deployer: org.Jboss.deployment.DeploymentInfo@24bd343 { url=file:/C:/Downloads/temp/Jboss- 4.0.0/server/default/deploy/Hibernate.cfg.xml } deployer: null status: null state: INIT_WAITING_DEPLOYER watch: file:/C:/Downloads/temp/Jboss-4.0.0/server/default/deploy/Hibernate.cfg .xml altDD: null lastDeployed: 1113987414046 lastModified: 1113987414046 Incompletely deployed packages: org.Jboss.deployment.DeploymentInfo@24bd343 { url=file:/C:/Downloads/temp/Jboss- 4.0.0/server/default/deploy/Hibernate.cfg.xml } deployer: null status: null state: INIT_WAITING_DEPLOYERwatch: file:/C:/Downloads/temp/Jboss-4.0.0/server/default/deploy/Hibernate.cfg .xml altDD: null lastDeployed: 1113987414046 lastModified: 1113987414046 mbeans:

 

 答:这是在Jboss中使用Hibernate的常见问题。在Jboss的某个war包中使用Hibernate应该将Hibernate.cfg.xml文件放置到%war_dir%WEB-INF/classes中,但是Hibernate的factory仍然可能会提示Hibernate.cfg.xml not found。此问题解决方法如下。由于Jboss已经集成了Hibernate,在deploy\lib文件夹中hibernate2.jar的文件已经存在了一个jar包,所以实际的war中可能使用了shar的hibernate2.jar,由于ClassLoader只会在hibernate2.jar的同级及上级目录中寻找hibernate.cfg.xml,所以导致Hibernate并没有去查找%war_dir%WEB-INF/classes中的Hibernate.cfg.xml文件。删除deploy/lib下的hibernate2.jar或者使用绝对路径指定Hibernate.cfg.xml可以解决。除非有其他需求,否则在Jboss下部署Hibernate与在Tomcat下是一样的,并不需要加其他配置文件。

 

----------------------------------------------------------------------------------------------------------------------

 

6问:

 

到底在哪里使用cascade="..."?

 

答:cascade属性并不是多对多关系一定要用的,用了它只是插入或删除对象时更方便一些,只要在cascade的源头上插入或删除,所有cascade的关系就会被自动插入或删除。其中unsaved-value是个很重要的属性,Hibernate是通过这个属性来判断这个对象应该“save”还是“update”,如果这个对象的id是unsaved-value,那说明这个对象不是persistence object,要save(insert);如果id是非unsaved-value,那说明这个对象是persistence object(数据库中已存在),只要update就行了。

 

----------------------------------------------------------------------------------------------------------------------

 

 

7问:

 

到底在哪里使用inverse="true"

 

答:inverse属性默认是false,就是说关系的两端都来维护关系。这个意思就是说,如有3个表:Student、Teacher和TeacherStudent,Student对象和Teacher对象是多对多关系,这个关系由TeacherStudent表来表现。那么什么时候插入或删除TeacherStudent表中的记录呢。用Hibernate时,不会显式的对TeacherStudent表操作,对TeacherStudent的操作是Hibernate自动做的。Hibernate就是hbm文件中指定的是“谁”维护关系,在插入或删除时,就会触发对关系表的操作。前提是“谁”这个对象已经知道这个关系,就是说关系另一头的对象已经set或是add到“谁”这个对象里来。前面说过inverse默认是false,就是关系的两端都维护关系,对其中任一个操作都会触发对表的操作。当在关系的一头,如Student中的bag或set中用了inverse="true"时,就代表关系是由另一端维护的(Teacher)。就是说当插入Student时,不会操作TeacherStudent表,即使Student已经知道了关系。只有Teacher插入或删除时才会触发对关系表的操作。所以,关系的两头都用inverse="true"是不对的,会导致任何操作都不触发对关系表的操作。当两端都是inverse="false"或是default值时,在代码中对关系显式的维护也是不对的,会导致在关系表中插入两次关系。

 

----------------------------------------------------------------------------------------------------------------------

 

8问:

 

Cascade和Inverse有什么区别?

 

答:可以这样理解,Cascade定义的是关系两端对象到对象的级联关系;而Inverse定义的是关系和对象的级联关系。

 

----------------------------------------------------------------------------------------------------------------------

 

9问:

 

在删除操作时报错:net.sf.Hibernate.ObjectDeletedException:deleted object would be re-saved by cascade (remove deleted object from associations)

 

答:要删除关系的一头时(如,要删除一个已经和Student对象有关联的Teacher对象),当tx.commit()时才会抛出这个异常。防止出现这个异常的方法如下。      在Student端不用cascade。      或是用cascade的话,就显式的删除对像中的关系。      在Teacher端要用cascade。

 

----------------------------------------------------------------------------------------------------------------------

 

10问:

 

出现net.sf.Hibernate.HibernateException: identifier of an instance of my. MyObject altered from N to N异常

 

答:这个异常不是多对多关系中常遇到的,但是这个异常的提示容易让人混淆。这是因为在Java对象中,id定义和hbm文件的不一样。如Java中用long,而hbm中用type= "integer"。

 

----------------------------------------------------------------------------------------------------------------------

 

11问:

 

为什么在向数据库中插入长字符串时候部分自动丢失在向数据库中增加一条新的条目时,发现如果文字(有英文字母,也有汉字)数量特别大,超过1000个,则每次通过Hibernate,向一个String类型的字段中增加数据时,只有几百个字可以增加进去,其他的自动丢失了。

 

答:这是由于字段长度设置不合理造成的。可以根据字符串实际长度考虑使用Text、LongText、或者Blob等字段类型。不同数据库的字段类型稍有不同,可以参考相关手册。另外需要注意的是一个汉字占用两个字节长度。

 

----------------------------------------------------------------------------------------------------------------------

 

12问:

 

为什么采用Hibernate的批量删除方法来删除大批量的记录数据时速度特别慢

 

答:在使用Hibernate版本2.X时,不推荐采用Hibernate的批量删除方法来删除大量记录。原因是,Hibernate会执行1条查询语句,另外还有满足条件的多条删除语句,而不是一次执行一个删除语句,所以当待删除的数据很多时,会有很大的性能瓶颈。而对于Hibernate 3.0以上的版本,则不存这个问题。

 

----------------------------------------------------------------------------------------------------------------------

 

13问:升级Hibernate 3后在导入hbm映射文件时为什么非常非常慢原先在Hibernate 2中,程序的速度是非常快的。当环境顺利从Hibernate 2升级到Hibernate 3后,发布时在Tomcat的控制台中发现:Hibernate 3装载hbm映射文件时非常慢,差不多10秒钟才能装载一个hbm文件。

 

答:通过在Hibernate的源代码中设置断点,可以发现执行效率低下的代码在org.hibernate.cfg.Configuration文件中的第240行:addInputStream( new FileInputStream( xmlFile ) ); 而addInputStream函数中又包含:org.dom4j.Document doc = xmlHelper.createSAXReader( "XML InputStream", errors, entityResolver ).read( new InputSource( xmlInputStream ) ); 跟踪org.hibernate.util.XMLHelper中的函数createSAXReader可以得出结论,问题的症结出在这一条语句:org.dom4j.Document doc = xmlHelper.createSAXReader()可以判断这是在XML文件装载初始化时发生的错误,仔细检查XML文件,可以发现这是XML的第一行声明dtd的错误,因为以前使用的是Hibernate 2,所以hbm文件的dtd指向的是版本2,而升级Hibernate 3后,没有把老的hbm映射文件换成版本3。在更换为3版本后,此问题得到解决。

 

----------------------------------------------------------------------------------------------------------------------

 

14问:为什么Hibernate 3中的HQL无法查询汉字使用同样的代码和配置文件,在Hibernate 2上完全没有问题,在Hibernate 3中,使用如下HQL查询,无法得到正确的结果集:String hql = "from story where title like '%汉字%'"; Query q = session.createQuery(hql); 但用下面的HQL查询,却可以得到正确结果集:String hql = " from story where title like '%english%'"; Query q = session.createQuery(hql);

 

答:如果采用的是拼接HQL的方式,从Hibernate 2升级到Hibernate 3确实会出现汉字乱码问题。在控制台中可以看到,SQL的汉字部分变成了乱码:[DEBUG] 2005-08-14 14:33:58 org.hibernate.SQL - "select story0_.content from story as story0_ where story0_.title like '%&–°é—&&Š¨&

 

剪切与别人的空间,仅供自己参考。。。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics