Hibernate常见的Exception

来源:互联网 发布:使命召唤5枪支数据 编辑:程序博客网 时间:2024/04/29 05:29
</pre><p>在网上找的Hibernate的错误,都记下来了!</p><p></p><pre name="code" class="java">Exception in thread "main" org.hibernate.MappingException: Could not determine type for: java.lang.int, at table: users, for columns: [org.hibernate.mapping.Column(userId)]这个是由于写user.hbm.xml中<id name="userId" type="java.lang.int">  没有存在的int型要写成<id name="userId" type="java.lang.Integer"> 要用Integer型 Exception in thread "main" org.hibernate.PropertyAccessException: Exception occurred inside getter of entity.User.userId 报如下,异常是因为,在Person对象中.设置的属性类型不一致造成的.. 请检查。对应bean中set方法数据类型和hibernate配置文件中定义的类型是否一致。   比如你Person中的属性id 定义的类型为Integer ,而set方法是int id.这样则会发生这样的错误.改成统一的类型即可..   org.hibernate.InvalidMappingException: Could not parse mapping document from resource entity/Info.hbm.xml要是出现这个错误,一般来说就是hbm.xml中 没有加包名导致的 org.hibernate.LazyInitializationException: could not initialize proxy - no Session 总结:原因是hibernate的session已经关闭,集合没有被初始化。在hibernate中:hibernate3 默认支持延迟加载(lazy="proxy"我们可以把proxy看作是true),hibernate2 默认立即加载(lazy="false")。      在hibernate3中,所有的实体设置文件(user.hbm.xml)中的lazy属性都被默认设成了true,就是当这个类没有被调用时,延时加载,导致了以上情况的发生,在配置文件中将lzay属性设为false就可以了。---------------------------------------------------------------- 原因 :<may-to-one>or<one-to-may> 的 lazy 属性默认为 :lazy = "proxy"解决 :<many-to-one>   & <set> 中设置 lazy="false"  Exception in thread "main" org.hibernate.SessionException: Session is closed如果调用 delete()方法 或者其他方法前 要调用 get()方法 得到对象 那么中间不能关闭连接如果是通用的 dao类 那么要建立一个 不关闭连接的 get()得到对象的方法java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.IntegerHibernate中使用聚集函数异常代码:原因:由于Hibernate3.2.5版本的(select count(*))查询返回的结果是个Long 不能强制转换。解决方法:方法1:借用String进行转换:public int method(arg.........){Session session=getSession();   Query query=session.createQuery(hql);---关键----Long lo=(Long)query.uniqueResult();---关键---   Integer intge=new Integer(String.valueOf(lo));   return intge;}方法2:用hashcode()public int method(arg.........){Session session=getSession();   Query query=session.createQuery(hql);   return ---关键----query.uniqueResult().hashCode();  <p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">1、java.lang.noclassdeffounderror:org/hibernate/cfg/hbmbinder$secondPass</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">把hibernate-annotations.jar删除即可。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p align="left" style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">2、entity class not found</span></p><p align="left" style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">但是对应的类确实存在,检查hbm.xml中的class对应的类名和实体的路径是否一致</span></p><p align="left" style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p align="left" style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">3、Remember that ordinal parameters are 1-based!</span></p><p align="left" style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">HQL语句错误</span></p><p align="left" style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p align="left" style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">4、hibernate   Unknown    entity class   错误</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">在hibernate.cfg.xml中添加<mapping    resource="packagename.Info.hbm.xml"/></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">1问:Hibernate初始化时总是报错:java.lang.NoClassDefFoundError</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">Hibernate初始化时出现出错代码:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">java.lang.NoClassDefFoundError: net/sf/ehcache/CacheException</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:这是新手常见问题。是因为使用默认设置时,Hibernate文档里指出的Hibernate库不完整,缺少ehcache.jar(用于支持Ehcache的相关文件)。配置中加入以上文件,就可以避免初始化时出现java.lang.NoClassDefFoundError:net/sf/ehcache/CacheException异常。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">2问:Hibernate报错:"Not binding factory to JNDI, no JNDI name configured"</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">运行下列程序:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">public static void main(String[] args) throws Exception {</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">       Configuration conf = new Configuration().addClass(Person.class);</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">......</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">出现错误码:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">12:15:34,250 INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI, no JNDI name configured</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">java.lang.UnsupportedOperationException: The user must supply a JDBC connection</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">at net.sf.Hibernate.connection.UserSuppliedConnectionProvider.getConnection (UserSuppliedConnectionProvider.java:32)</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">at net.sf.Hibernate.impl.BatcherImpl.openConnection(BatcherImpl.java:289)</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">at net.sf.Hibernate.impl.SessionImpl.connect(SessionImpl.java:3361)</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">at net.sf.Hibernate.impl.SessionImpl.connection(SessionImpl.java:3321)</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">at net.sf.Hibernate.impl.BatcherImpl.prepareQueryStatement(BatcherImpl.java:66)</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">at net.sf.Hibernate.loader.Loader.prepareQueryStatement(Loader.java:779)</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">at net.sf.Hibernate.hql.QueryTranslator.iterate(QueryTranslator.java:864)</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">at net.sf.Hibernate.impl.SessionImpl.iterate(SessionImpl.java:1618)</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">at net.sf.Hibernate.impl.QueryImpl.iterate(QueryImpl.java:27)</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">at com.Hibernate.person.TestQueryPerson.main(TestQueryPerson.java:28)</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">Exception in thread "main"</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:修改main函数,为该程序指定配置文件即可。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">public static void main(String[] args) throws Exception {</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">     File file=new File("./Hibernate.cfg.xml");</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">       Configuration conf = new Configuration().configure(file);</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">......</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">配置文件如下。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;"><?xml version="1.0"?></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;"><!DOCTYPE Hibernate-mapping PUBLIC</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">"-//Hibernate/Hibernate Mapping DTD 3.0//EN"</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">"http://Hibernate.sourceforge.net/Hibernate-mapping-3.0.dtd"></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;"><!--</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">This mapping demonstrates content-based discrimination for the</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">table-per-hierarchy mapping strategy, using a formula</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">discriminator.</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">--></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;"><Hibernate-mapping package="org.Hibernate.test.array"></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">    <class name="A" lazy="true"></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">      <id name="id"></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">         <generator class="native"/></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">    </id></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">    <array name="bs" cascade="all" fetch="join"></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">        <key column="a_id"/></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">        <list-index column="idx"/></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">         <one-to-many class="B"/></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">      </array></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;"></class></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;"><class name="B" lazy="true"></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">    <id name="id"></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">        <generator class="native"/></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">    </id></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;"></class></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;"></Hibernate-mapping></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"> </p><p style="margin: 6pt 0cm 6pt 30pt; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">3问:使用开发工具Elipse,运行时总报java.lang.NoClassDefFoundError: org/ Hibernate/Session异常</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">使用Elipse,所用包是hibernte 3,发现在Action中每次执行到:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">session=HibernateSessionFactory.currentSession();</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">时,出现java.lang.NoClassDefFoundError: org/Hibernate/Session异常,如下:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">java.lang.NoClassDefFoundError: org/Hibernate/Session</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">            Hibernate3.Hibernate.ExcuteClass.search(ExcuteClass.java:17)</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">            Hibernate3.Hibernate.ExcuteClass.test3(ExcuteClass.java:13)</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">            Hibernate3.Hibernate.Svlt.doGet(Svlt.java:50)</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">            javax.servlet.http.HttpServlet.service(HttpServlet.java:689)</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.6pt;"><span style="font-size: 12pt;">            javax.servlet.http.HttpServlet.service(HttpServlet.java:802)[/b]</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:这是初学者常见问题,原因是没有导入hibernate 3.jar包,虽然把hibernate 3.jar写入了Classpath,但部署的时候却没有拷贝到lib下面,可以手动拷贝进入。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 6pt 0cm 6pt 30pt; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; page-break-before: always;"><span style="font-size: 12pt;">4问:执行如下方法时,发生"No CurrentSessionContext configured"错误</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">执行如下方法时,发生"No CurrentSessionContext configured"错误:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">Public static Session currentSession() {</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">try {</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">      System.out.println("HibernateUtil.currentSession() - start");</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">      return getSessionFactory().getCurrentSession();</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">} catch (HibernateException ex) {</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">    System.out.println("HibernateUtil.currentSession() - failed due to " + ex);</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">    throw ex;</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">    }</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">}</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:这个错误是由配置文件引起。在集成Hibernate的环境下(例如Jboss),在session-factory段加入:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;"><property name="Hibernate.current_session_context_class">jta</property></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">在不集成Hibernate的环境下(例如使用JDBC的独立应用程序),在session-factory段加入:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;"><property name="Hibernate.current_session_context_class">thread</property></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">就可以解决这个问题。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 9pt 0cm 9pt 30pt; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">5问:移植Jboss 4下配置Hibernate出错</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">在Tomcat 5下配置Hibernate成功,但移植到Jboss 4下出现了很多问题。已在deploy目录下放置了Hibernate-service.xml和Hibernate.cfg.xml文件,但启动服务器仍然报错   如下。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">16:56:54,046 ERROR [URLDeploymentScanner] Incomplete Deployment listing:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">Packages waiting for a deployer:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">org.Jboss.deployment.DeploymentInfo@24bd343 { url=file:/C:/Downloads/temp/Jboss-</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">4.0.0/server/default/deploy/Hibernate.cfg.xml }</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">deployer: null</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">status: null</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">state: INIT_WAITING_DEPLOYER</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">watch: file:/C:/Downloads/temp/Jboss-4.0.0/server/default/deploy/Hibernate.cfg</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">.xml</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">altDD: null</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">lastDeployed: 1113987414046</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">lastModified: 1113987414046</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">mbeans:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">Incompletely deployed packages:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">org.Jboss.deployment.DeploymentInfo@24bd343 { url=file:/C:/Downloads/temp/Jboss-</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">4.0.0/server/default/deploy/Hibernate.cfg.xml }</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">deployer: null</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.1pt;"><span style="font-size: 12pt;">status: null</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.8pt;"><span style="font-size: 12pt;">state: INIT_WAITING_DEPLOYER</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.8pt;"><span style="font-size: 12pt;">watch: file:/C:/Downloads/temp/Jboss-4.0.0/server/default/deploy/Hibernate.cfg</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 11.8pt;"><span style="font-size: 12pt;">.xml</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">altDD: null</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">lastDeployed: 1113987414046</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">lastModified: 1113987414046</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">mbeans:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:这是在Jboss中使用Hibernate的常见问题。在Jboss的某个war包中使用Hibernate应该将Hibernate.cfg.xml文件放置到%war_dir%WEB-INF/classes中,但是Hibernate的factory仍然可能会提示Hibernate.cfg.xml not found。此问题解决方法如下。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">由于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可以解决。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">除非有其他需求,否则在Jboss下部署Hibernate与在Tomcat下是一样的,并不需要加其他配置文件。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 9pt 0cm 9pt 30pt; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">6问:到底在哪里使用cascade="..."?</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:cascade属性并不是多对多关系一定要用的,用了它只是插入或删除对象时更方便一些,只要在cascade的源头上插入或删除,所有cascade的关系就会被自动插入或删除。其中unsaved-value是个很重要的属性,Hibernate是通过这个属性来判断这个对象应该“save”还是“update”,如果这个对象的id是unsaved-value,那说明这个对象不是persistence object,要save(insert);如果id是非unsaved-value,那说明这个对象是persistence object(数据库中已存在),只要update就行了。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 9pt 0cm 9pt 30pt; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">7问:到底在哪里使用inverse="true"</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:inverse属性默认是false,就是说关系的两端都来维护关系。这个意思就是说,如有3个表:Student、Teacher和TeacherStudent,Student对象和Teacher对象是多对多关系,这个关系由TeacherStudent表来表现。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">那么什么时候插入或删除TeacherStudent表中的记录呢。用Hibernate时,不会显式的对TeacherStudent表操作,对TeacherStudent的操作是Hibernate自动做的。Hibernate就是hbm文件中指定的是“谁”维护关系,在插入或删除时,就会触发对关系表的操作。前提是“谁”这个对象已经知道这个关系,就是说关系另一头的对象已经set或是add到“谁”这个对象里来。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">前面说过inverse默认是false,就是关系的两端都维护关系,对其中任一个操作都会触发对表的操作。当在关系的一头,如Student中的bag或set中用了inverse="true"时,就代表关系是由另一端维护的(Teacher)。就是说当插入Student时,不会操作TeacherStudent表,即使Student已经知道了关系。只有Teacher插入或删除时才会触发对关系表的操作。所以,关系的两头都用inverse="true"是不对的,会导致任何操作都不触发对关系表的操作。当两端都是inverse="false"或是default值时,在代码中对关系显式的维护也是不对的,会导致在关系表中插入两次关系。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 7pt 0cm 7pt 30pt; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">8问:Cascade和Inverse有什么区别?</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:可以这样理解,Cascade定义的是关系两端对象到对象的级联关系;而Inverse定义的是关系和对象的级联关系。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto 5px 30.7pt; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; text-indent: -30.7pt;"><span style="font-size: 12pt;">9问:在删除操作时报错:net.sf.Hibernate.ObjectDeletedException:deleted object would be re-saved by cascade (remove deleted object from associations)</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:要删除关系的一头时(如,要删除一个已经和Student对象有关联的Teacher对象),当tx.commit()时才会抛出这个异常。防止出现这个异常的方法如下。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;"><img src="http://book.csdn.net/BookFiles/321/img/image023.jpg" border="0" alt="*" width="10" height="10" style="border-width: 0px;" />      在Student端不用cascade。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;"><img src="http://book.csdn.net/BookFiles/321/img/image023.jpg" border="0" alt="*" width="10" height="10" style="border-width: 0px;" />      或是用cascade的话,就显式的删除对像中的关系。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;"><img src="http://book.csdn.net/BookFiles/321/img/image023.jpg" border="0" alt="*" width="10" height="10" style="border-width: 0px;" />      在Teacher端要用cascade。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto 5px 37.8pt; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; text-indent: -37.8pt;"><span style="font-size: 12pt;">10问:出现net.sf.Hibernate.HibernateException: identifier of an instance of my. MyObject altered from N to N异常</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;">答:这个异常不是多对多关系中常遇到的,但是这个异常的提示容易让人混淆。这是因为在Java对象中,id定义和hbm文件的不一样。如Java中用long,而hbm中用type= "integer"。11问:为什么在向数据库中插入长字符串时候部分自动丢失</p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">在向数据库中增加一条新的条目时,发现如果文字(有英文字母,也有汉字)数量特别大,超过1000个,则每次通过Hibernate,向一个String类型的字段中增加数据时,只有几百个字可以增加进去,其他的自动丢失了。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:这是由于字段长度设置不合理造成的。可以根据字符串实际长度考虑使用Text、LongText、或者Blob等字段类型。不同数据库的字段类型稍有不同,可以参考相关手册。另外需要注意的是一个汉字占用两个字节长度。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto 5px 38.4pt; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; text-indent: -38.4pt;"><span style="font-size: 12pt;">12问:为什么采用Hibernate的批量删除方法来删除大批量的记录数据时速度特别慢</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:在使用Hibernate版本2.X时,不推荐采用Hibernate的批量删除方法来删除大量记录。原因是,Hibernate会执行1条查询语句,另外还有满足条件的多条删除语句,而不是一次执行一个删除语句,所以当待删除的数据很多时,会有很大的性能瓶颈。而对于Hibernate 3.0以上的版本,则不存这个问题。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">13问:升级Hibernate 3后在导入hbm映射文件时为什么非常非常慢</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">原先在Hibernate 2中,程序的速度是非常快的。当环境顺利从Hibernate 2升级到Hibernate 3后,发布时在Tomcat的控制台中发现:Hibernate 3装载hbm映射文件时非常慢,差不多10秒钟才能装载一个hbm文件。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:通过在Hibernate的源代码中设置断点,可以发现执行效率低下的代码在org.hibernate.cfg.Configuration文件中的第240行:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">addInputStream( new FileInputStream( xmlFile ) );</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">而addInputStream函数中又包含:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">org.dom4j.Document doc = xmlHelper.createSAXReader( "XML InputStream", errors, entityResolver ).read( new InputSource( xmlInputStream ) );</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">跟踪org.hibernate.util.XMLHelper中的函数createSAXReader可以得出结论,问题的症结出在这一条语句:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">org.dom4j.Document doc = xmlHelper.createSAXReader()</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">可以判断这是在XML文件装载初始化时发生的错误,仔细检查XML文件,可以发现这是XML的第一行声明dtd的错误,因为以前使用的是Hibernate 2,所以hbm文件的dtd指向的是版本2,而升级Hibernate 3后,没有把老的hbm映射文件换成版本3。在更换为3版本后,此问题得到解决。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">14问:为什么Hibernate 3中的HQL无法查询汉字</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">使用同样的代码和配置文件,在Hibernate 2上完全没有问题,在Hibernate 3中,使用如下HQL查询,无法得到正确的结果集:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">String hql = "from story where title like '%汉字%'";</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">Query q = session.createQuery(hql);</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">但用下面的HQL查询,却可以得到正确结果集:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">String hql = " from story where title like '%english%'";</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">Query q = session.createQuery(hql);</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:如果采用的是拼接HQL的方式,从Hibernate 2升级到Hibernate 3确实会出现汉字乱码问题。在控制台中可以看到,SQL的汉字部分变成了乱码:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">[DEBUG] 2005-08-14 14:33:58 org.hibernate.SQL - "select story0_.content from story as story0_ where story0_.title like '%&–°é—&&`¨&'</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">在Hibernate中,查询时应尽量使用占位符的写法(如下),这样既可以避免乱码问题,又可以避免潜在的SQL注入攻击:</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">getHibernate().find("from story where title like ? ", "%汉字%")</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">15问:Hibernate 3中如何获得库表所有字段的名称</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:可以使用以下的程序获得。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">Configuration conf = new Configuration();</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">                      conf.configure();</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">                      Iterator iter =   conf.getTableMappings();</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">                </span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.15pt;"><span style="font-size: 12pt;">                      while ( iter.hasNext() ) {</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.15pt;"><span style="font-size: 12pt;">                                  Table table = ( Table ) iter.next();</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.15pt;"><span style="font-size: 12pt;">                       </span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.15pt;"><span style="font-size: 12pt;">                                  System.out.println(table.getName());</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.15pt;"><span style="font-size: 12pt;">                                  Iterator ics = table.getColumnIterator();</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.15pt;"><span style="font-size: 12pt;">                                  while (ics.hasNext()){</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.15pt;"><span style="font-size: 12pt;">                                             Column col = (Column) ics.next();</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.15pt;"><span style="font-size: 12pt;">                                             System.out.println(col.getName());</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.15pt;"><span style="font-size: 12pt;">                                  }</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.15pt;"><span style="font-size: 12pt;">                     }</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 12.15pt;"> </p><p style="margin: 5px auto 5px 28.5pt; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; text-indent: -28.5pt;"><span style="font-size: 12pt;">16问:错误代码:ObjectNotFoundException: No row with the given identifier exists</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:在以下几种情况下,该错误可能会发生。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">      当试图使用session.load()方法装载一个未被代理的对象,或者访问一个超出范围的代理对象时。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">      当装载一个未被正确取得的映射时。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">      当未被外键约束的外键字段中含有非法值时。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">检查装载使用的主键Id,并验证外键关系,以确定数据库中已经存在相应的约束关系。坚持“在一个Session中只处理一个事务”的原则。因为当在单一Session中使用多个事务时很容易犯错。尤其注意,在一个HibernateException已经抛出后不要再操作Session。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto 5px 39.05pt; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; text-indent: -39.05pt;"><span style="font-size: 12pt;">17问:错误代码:InvalidObjectException: Could not find a SessionFactory named: null</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:这个错误在以下几种情况下经常发生。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">      试图序列化一个已经失效的Hibernate Session,然后在另外一个虚拟机中进行反序列化。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">      类装载器被重置,例如在未重启的application server或者Web container中重新部署程序。在使用Tomcat时会经常遇到这个问题,这是因为application server中一般使用JNDI来存储SessionFactory,而在Tomcat或其他一些Web容器中,则是通过在context重载时,关闭HttpSession序列化来实现的。这种实现方式会引起这个错误发生。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto 5px 37.2pt; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; text-indent: -37.2pt;"><span style="font-size: 12pt;">18问:错误代码:org.hibernate.HibernateException: CGLIB Enhancement failed: <classname></span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:Hibernate 3的默认方式是把所有类通过代理方式来进行延迟加载。如果代码中的类有一个私有无参的构造器的话,Hibernate将无法在运行时将项目代码中的类作为子类装载。为了避免这个错误,类中的构造器函数至少应该在包内可见。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto 5px 37.8pt; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; text-indent: -37.8pt;"><span style="font-size: 12pt;">19问:为什么在Hibernate中添加、删除、修改一个对象或Collection,但是数据库中实际上没有任何变化</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:这个问题经常会困扰初学者。这是因为如果没有使用Hibernate的自动事务处理,则必需显式的提交事务,操作才会在数据库中执行。</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"> </p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">20问:为什么保存一个父对象,而它的关联对象没有自动储存到数据库里</span></p><p style="margin: 5px auto; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="font-size: 12pt;">答:关联对象必需显式的调用session.save()(或session.persist()),或者在关联的映射文件中加入cascade="all"或cascade="save-update"(或cascade="persist")才能够自动关联执行。</span></p>  

0 0