上海人才网官网站首页,娱乐网站模板,如何使用域名访问网站,做网站卖产品要注册公司吗Hibernate常见问题集锦1问#xff1a;Hibernate初始化时总是报错#xff1a;java.lang.NoClassDefFoundErrorHibernate初始化时出现出错代码#xff1a;java.lang.NoClassDefFoundError: net/sf/ehcache/CacheException答#xff1a;这是新手常见问题。是因为使用默认设置时… Hibernate常见问题集锦 1问Hibernate初始化时总是报错java.lang.NoClassDefFoundError Hibernate初始化时出现出错代码 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 configured java.lang.UnsupportedOperationException: The user must supply a JDBC connection at 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 filenew File(./Hibernate.cfg.xml); Configuration conf new Configuration().configure(file); ...... 配置文件如下。 -//Hibernate/Hibernate Mapping DTD 3.0//EN http://Hibernate.sourceforge.net/Hibernate-mapping-3.0.dtd hibernate-mapping packageorg.Hibernate.test.array/hibernate-mapping class nameA lazytrue/class 3问使用开发工具Elipse运行时总报java.lang.NoClassDefFoundError: org/ Hibernate/Session异常 使用Elipse所用包是hibernte 3发现在Action中每次执行到 sessionHibernateSessionFactory.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 nameHibernate.current_session_context_classjta/property 在不集成Hibernate的环境下例如使用JDBC的独立应用程序在session-factory段加入 property nameHibernate.current_session_context_classthread/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.DeploymentInfo24bd343 { urlfile:/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 mbeans: Incompletely deployed packages: org.Jboss.deployment.DeploymentInfo24bd343 { urlfile:/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 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要saveinsert)如果id是非unsaved-value那说明这个对象是persistence object数据库中已存在只要update就行了。 7问到底在哪里使用inversetrue 答inverse属性默认是false就是说关系的两端都来维护关系。这个意思就是说如有3个表Student、Teacher和TeacherStudentStudent对象和Teacher对象是多对多关系这个关系由TeacherStudent表来表现。 那么什么时候插入或删除TeacherStudent表中的记录呢。用Hibernate时不会显式的对TeacherStudent表操作对TeacherStudent的操作是Hibernate自动做的。Hibernate就是hbm文件中指定的是“谁”维护关系在插入或删除时就会触发对关系表的操作。前提是“谁”这个对象已经知道这个关系就是说关系另一头的对象已经set或是add到“谁”这个对象里来。 前面说过inverse默认是false就是关系的两端都维护关系对其中任一个操作都会触发对表的操作。当在关系的一头如Student中的bag或set中用了inversetrue时就代表关系是由另一端维护的Teacher。就是说当插入Student时不会操作TeacherStudent表即使Student已经知道了关系。只有Teacher插入或删除时才会触发对关系表的操作。所以关系的两头都用inversetrue是不对的会导致任何操作都不触发对关系表的操作。当两端都是inversefalse或是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 %–°é—¨ 在Hibernate中查询时应尽量使用占位符的写法如下这样既可以避免乱码问题又可以避免潜在的SQL注入*** getHibernate().find(from story where title like ? , %汉字%) 15问Hibernate 3中如何获得库表所有字段的名称 答可以使用以下的程序获得。 Configuration conf new Configuration(); conf.configure(); Iterator iter conf.getTableMappings(); while ( iter.hasNext() ) { Table table ( Table ) iter.next(); System.out.println(table.getName()); Iterator ics table.getColumnIterator(); while (ics.hasNext()){ Column col (Column) ics.next(); System.out.println(col.getName()); } 16问错误代码ObjectNotFoundException: No row with the given identifier exists 答在以下几种情况下该错误可能会发生。 当试图使用session.load()方法装载一个未被代理的对象或者访问一个超出范围的代理对象时。 当装载一个未被正确取得的映射时。 当未被外键约束的外键字段中含有非法值时。 检查装载使用的主键Id并验证外键关系以确定数据库中已经存在相应的约束关系。坚持“在一个Session中只处理一个事务”的原则。因为当在单一Session中使用多个事务时很容易犯错。尤其注意在一个HibernateException已经抛出后不要再操作Session。 17问错误代码InvalidObjectException: Could not find a SessionFactory named: null 答这个错误在以下几种情况下经常发生。 试图序列化一个已经失效的Hibernate Session然后在另外一个虚拟机中进行反序列化。 类装载器被重置例如在未重启的application server或者Web container中重新部署程序。在使用Tomcat时会经常遇到这个问题这是因为application server中一般使用JNDI来存储SessionFactory而在Tomcat或其他一些Web容器中则是通过在context重载时关闭HttpSession序列化来实现的。这种实现方式会引起这个错误发生。 18问错误代码org.hibernate.HibernateException: CGLIB Enhancement failed: classname/classname 答Hibernate 3的默认方式是把所有类通过代理方式来进行延迟加载。如果代码中的类有一个私有无参的构造器的话Hibernate将无法在运行时将项目代码中的类作为子类装载。为了避免这个错误类中的构造器函数至少应该在包内可见。 19问为什么在Hibernate中添加、删除、修改一个对象或Collection但是数据库中实际上没有任何变化 答这个问题经常会困扰初学者。这是因为如果没有使用Hibernate的自动事务处理则必需显式的提交事务操作才会在数据库中执行。 20问为什么保存一个父对象而它的关联对象没有自动储存到数据库里 答关联对象必需显式的调用session.save()或session.persist()或者在关联的映射文件中加入cascadeall或cascadesave-update或cascadepersist才能够自动关联执行。 转载于:https://blog.51cto.com/nikoo/188903