迷失北京

          BlogJava 聯(lián)系 聚合 管理
            60 Posts :: 0 Stories :: 13 Comments :: 0 Trackbacks

          1、java.lang.noclassdeffounderror:org/hibernate/cfg/hbmbinder$secondPass

          把hibernate-annotations.jar刪除即可。

           

          2、entity class not found

          但是對(duì)應(yīng)的類確實(shí)存在,檢查hbm.xml中的class對(duì)應(yīng)的類名和實(shí)體的路徑是否一致

           

          3、Remember that ordinal parameters are 1-based!

          HQL語(yǔ)句錯(cuò)誤

           

          4、hibernate   Unknown    entity class   錯(cuò)誤


          在hibernate.cfg.xml中添加<mapping    resource="packagename.Info.hbm.xml"/>

           

          1問(wèn):Hibernate初始化時(shí)總是報(bào)錯(cuò):java.lang.NoClassDefFoundError

          Hibernate初始化時(shí)出現(xiàn)出錯(cuò)代碼:

          java.lang.NoClassDefFoundError: net/sf/ehcache/CacheException

          答:這是新手常見問(wèn)題。是因?yàn)槭褂媚J(rèn)設(shè)置時(shí),Hibernate文檔里指出的Hibernate庫(kù)不完整,缺少ehcache.jar(用于支持Ehcache的相關(guān)文件)。配置中加入以上文件,就可以避免初始化時(shí)出現(xiàn)java.lang.NoClassDefFoundError:net/sf/ehcache/CacheException異常。

           

          2問(wèn):Hibernate報(bào)錯(cuò):"Not binding factory to JNDI, no JNDI name configured"

          運(yùn)行下列程序:

          public static void main(String[] args) throws Exception {

                 Configuration conf = new Configuration().addClass(Person.class);

          ......

          出現(xiàn)錯(cuò)誤碼:

          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函數(shù),為該程序指定配置文件即可。

          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問(wèn):使用開發(fā)工具Elipse,運(yùn)行時(shí)總報(bào)java.lang.NoClassDefFoundError: org/ Hibernate/Session異常

          使用Elipse,所用包是hibernte 3,發(fā)現(xiàn)在Action中每次執(zhí)行到:

          session=HibernateSessionFactory.currentSession();

          時(shí),出現(xiàn)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]

          答:這是初學(xué)者常見問(wèn)題,原因是沒有導(dǎo)入hibernate 3.jar包,雖然把hibernate 3.jar寫入了Classpath,但部署的時(shí)候卻沒有拷貝到lib下面,可以手動(dòng)拷貝進(jìn)入。

           

          4問(wèn):執(zhí)行如下方法時(shí),發(fā)生"No CurrentSessionContext configured"錯(cuò)誤

          執(zhí)行如下方法時(shí),發(fā)生"No CurrentSessionContext configured"錯(cuò)誤:

          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;

              }

          }

          答:這個(gè)錯(cuò)誤是由配置文件引起。在集成Hibernate的環(huán)境下(例如Jboss),在session-factory段加入:

          <property name="Hibernate.current_session_context_class">jta</property>

          在不集成Hibernate的環(huán)境下(例如使用JDBC的獨(dú)立應(yīng)用程序),在session-factory段加入:

          <property name="Hibernate.current_session_context_class">thread</property>

          就可以解決這個(gè)問(wèn)題。

           

          5問(wèn):移植Jboss 4下配置Hibernate出錯(cuò)

          在Tomcat 5下配置Hibernate成功,但移植到Jboss 4下出現(xiàn)了很多問(wèn)題。已在deploy目錄下放置了Hibernate-service.xml和Hibernate.cfg.xml文件,但啟動(dòng)服務(wù)器仍然報(bào)錯(cuò)   如下。

          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

          mbeans:

          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_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的常見問(wèn)題。在Jboss的某個(gè)war包中使用Hibernate應(yīng)該將Hibernate.cfg.xml文件放置到%war_dir%WEB-INF/classes中,但是Hibernate的factory仍然可能會(huì)提示Hibernate.cfg.xml not found。此問(wèn)題解決方法如下。

          由于Jboss已經(jīng)集成了Hibernate,在deploy"lib文件夾中hibernate2.jar的文件已經(jīng)存在了一個(gè)jar包,所以實(shí)際的war中可能使用了shar的hibernate2.jar,由于ClassLoader只會(huì)在hibernate2.jar的同級(jí)及上級(jí)目錄中尋找hibernate.cfg.xml,所以導(dǎo)致Hibernate并沒有去查找%war_dir%WEB-INF/classes中的Hibernate.cfg.xml文件。刪除deploy/lib下的hibernate2.jar或者使用絕對(duì)路徑指定Hibernate.cfg.xml可以解決。

          除非有其他需求,否則在Jboss下部署Hibernate與在Tomcat下是一樣的,并不需要加其他配置文件。

           

          6問(wèn):到底在哪里使用cascade="..."?

          答:cascade屬性并不是多對(duì)多關(guān)系一定要用的,用了它只是插入或刪除對(duì)象時(shí)更方便一些,只要在cascade的源頭上插入或刪除,所有cascade的關(guān)系就會(huì)被自動(dòng)插入或刪除。其中unsaved-value是個(gè)很重要的屬性,Hibernate是通過(guò)這個(gè)屬性來(lái)判斷這個(gè)對(duì)象應(yīng)該“save”還是“update”,如果這個(gè)對(duì)象的id是unsaved-value,那說(shuō)明這個(gè)對(duì)象不是persistence object,要save(insert);如果id是非unsaved-value,那說(shuō)明這個(gè)對(duì)象是persistence object(數(shù)據(jù)庫(kù)中已存在),只要update就行了。

           

          7問(wèn):到底在哪里使用inverse="true"

          答:inverse屬性默認(rèn)是false,就是說(shuō)關(guān)系的兩端都來(lái)維護(hù)關(guān)系。這個(gè)意思就是說(shuō),如有3個(gè)表:Student、Teacher和TeacherStudent,Student對(duì)象和Teacher對(duì)象是多對(duì)多關(guān)系,這個(gè)關(guān)系由TeacherStudent表來(lái)表現(xiàn)。

          那么什么時(shí)候插入或刪除TeacherStudent表中的記錄呢。用Hibernate時(shí),不會(huì)顯式的對(duì)TeacherStudent表操作,對(duì)TeacherStudent的操作是Hibernate自動(dòng)做的。Hibernate就是hbm文件中指定的是“誰(shuí)”維護(hù)關(guān)系,在插入或刪除時(shí),就會(huì)觸發(fā)對(duì)關(guān)系表的操作。前提是“誰(shuí)”這個(gè)對(duì)象已經(jīng)知道這個(gè)關(guān)系,就是說(shuō)關(guān)系另一頭的對(duì)象已經(jīng)set或是add到“誰(shuí)”這個(gè)對(duì)象里來(lái)。

          前面說(shuō)過(guò)inverse默認(rèn)是false,就是關(guān)系的兩端都維護(hù)關(guān)系,對(duì)其中任一個(gè)操作都會(huì)觸發(fā)對(duì)表的操作。當(dāng)在關(guān)系的一頭,如Student中的bag或set中用了inverse="true"時(shí),就代表關(guān)系是由另一端維護(hù)的(Teacher)。就是說(shuō)當(dāng)插入Student時(shí),不會(huì)操作TeacherStudent表,即使Student已經(jīng)知道了關(guān)系。只有Teacher插入或刪除時(shí)才會(huì)觸發(fā)對(duì)關(guān)系表的操作。所以,關(guān)系的兩頭都用inverse="true"是不對(duì)的,會(huì)導(dǎo)致任何操作都不觸發(fā)對(duì)關(guān)系表的操作。當(dāng)兩端都是inverse="false"或是default值時(shí),在代碼中對(duì)關(guān)系顯式的維護(hù)也是不對(duì)的,會(huì)導(dǎo)致在關(guān)系表中插入兩次關(guān)系。

           

          8問(wèn):Cascade和Inverse有什么區(qū)別?

          答:可以這樣理解,Cascade定義的是關(guān)系兩端對(duì)象到對(duì)象的級(jí)聯(lián)關(guān)系;而Inverse定義的是關(guān)系和對(duì)象的級(jí)聯(lián)關(guān)系。

           

          9問(wèn):在刪除操作時(shí)報(bào)錯(cuò):net.sf.Hibernate.ObjectDeletedException:deleted object would be re-saved by cascade (remove deleted object from associations)

          答:要?jiǎng)h除關(guān)系的一頭時(shí)(如,要?jiǎng)h除一個(gè)已經(jīng)和Student對(duì)象有關(guān)聯(lián)的Teacher對(duì)象),當(dāng)tx.commit()時(shí)才會(huì)拋出這個(gè)異常。防止出現(xiàn)這個(gè)異常的方法如下。

          *      在Student端不用cascade。

          *      或是用cascade的話,就顯式的刪除對(duì)像中的關(guān)系。

          *      在Teacher端要用cascade。

           

          10問(wèn):出現(xiàn)net.sf.Hibernate.HibernateException: identifier of an instance of my. MyObject altered from N to N異常

          答:這個(gè)異常不是多對(duì)多關(guān)系中常遇到的,但是這個(gè)異常的提示容易讓人混淆。這是因?yàn)樵贘ava對(duì)象中,id定義和hbm文件的不一樣。如Java中用long,而hbm中用type= "integer"。11問(wèn):為什么在向數(shù)據(jù)庫(kù)中插入長(zhǎng)字符串時(shí)候部分自動(dòng)丟失

          在向數(shù)據(jù)庫(kù)中增加一條新的條目時(shí),發(fā)現(xiàn)如果文字(有英文字母,也有漢字)數(shù)量特別大,超過(guò)1000個(gè),則每次通過(guò)Hibernate,向一個(gè)String類型的字段中增加數(shù)據(jù)時(shí),只有幾百個(gè)字可以增加進(jìn)去,其他的自動(dòng)丟失了。

          答:這是由于字段長(zhǎng)度設(shè)置不合理造成的。可以根據(jù)字符串實(shí)際長(zhǎng)度考慮使用Text、LongText、或者Blob等字段類型。不同數(shù)據(jù)庫(kù)的字段類型稍有不同,可以參考相關(guān)手冊(cè)。另外需要注意的是一個(gè)漢字占用兩個(gè)字節(jié)長(zhǎng)度。

           

          12問(wèn):為什么采用Hibernate的批量刪除方法來(lái)刪除大批量的記錄數(shù)據(jù)時(shí)速度特別慢

          答:在使用Hibernate版本2.X時(shí),不推薦采用Hibernate的批量刪除方法來(lái)刪除大量記錄。原因是,Hibernate會(huì)執(zhí)行1條查詢語(yǔ)句,另外還有滿足條件的多條刪除語(yǔ)句,而不是一次執(zhí)行一個(gè)刪除語(yǔ)句,所以當(dāng)待刪除的數(shù)據(jù)很多時(shí),會(huì)有很大的性能瓶頸。而對(duì)于Hibernate 3.0以上的版本,則不存這個(gè)問(wèn)題。

           

           

          13問(wèn):升級(jí)Hibernate 3后在導(dǎo)入hbm映射文件時(shí)為什么非常非常慢

          原先在Hibernate 2中,程序的速度是非常快的。當(dāng)環(huán)境順利從Hibernate 2升級(jí)到Hibernate 3后,發(fā)布時(shí)在Tomcat的控制臺(tái)中發(fā)現(xiàn):Hibernate 3裝載hbm映射文件時(shí)非常慢,差不多10秒鐘才能裝載一個(gè)hbm文件。

          答:通過(guò)在Hibernate的源代碼中設(shè)置斷點(diǎn),可以發(fā)現(xiàn)執(zhí)行效率低下的代碼在org.hibernate.cfg.Configuration文件中的第240行:

          addInputStream( new FileInputStream( xmlFile ) );

          而addInputStream函數(shù)中又包含:

          org.dom4j.Document doc = xmlHelper.createSAXReader( "XML InputStream", errors, entityResolver ).read( new InputSource( xmlInputStream ) );

          跟蹤org.hibernate.util.XMLHelper中的函數(shù)createSAXReader可以得出結(jié)論,問(wèn)題的癥結(jié)出在這一條語(yǔ)句:

          org.dom4j.Document doc = xmlHelper.createSAXReader()

          可以判斷這是在XML文件裝載初始化時(shí)發(fā)生的錯(cuò)誤,仔細(xì)檢查XML文件,可以發(fā)現(xiàn)這是XML的第一行聲明dtd的錯(cuò)誤,因?yàn)橐郧笆褂玫氖荋ibernate 2,所以hbm文件的dtd指向的是版本2,而升級(jí)Hibernate 3后,沒有把老的hbm映射文件換成版本3。在更換為3版本后,此問(wèn)題得到解決。

           

           

          14問(wèn):為什么Hibernate 3中的HQL無(wú)法查詢漢字

          使用同樣的代碼和配置文件,在Hibernate 2上完全沒有問(wèn)題,在Hibernate 3中,使用如下HQL查詢,無(wú)法得到正確的結(jié)果集:

          String hql = "from story where title like '%漢字%'";

          Query q = session.createQuery(hql);

          但用下面的HQL查詢,卻可以得到正確結(jié)果集:

          String hql = " from story where title like '%english%'";

          Query q = session.createQuery(hql);

          答:如果采用的是拼接HQL的方式,從Hibernate 2升級(jí)到Hibernate 3確實(shí)會(huì)出現(xiàn)漢字亂碼問(wèn)題。在控制臺(tái)中可以看到,SQL的漢字部分變成了亂碼:

          [DEBUG] 2005-08-14 14:33:58 org.hibernate.SQL - "select story0_.content from story as story0_ where story0_.title like '%&–°é—&&`¨&'

          在Hibernate中,查詢時(shí)應(yīng)盡量使用占位符的寫法(如下),這樣既可以避免亂碼問(wèn)題,又可以避免潛在的SQL注入攻擊:

          getHibernate().find("from story where title like ? ", "%漢字%")

           

           

          15問(wèn):Hibernate 3中如何獲得庫(kù)表所有字段的名稱

          答:可以使用以下的程序獲得。

          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問(wèn):錯(cuò)誤代碼:ObjectNotFoundException: No row with the given identifier exists

          答:在以下幾種情況下,該錯(cuò)誤可能會(huì)發(fā)生。

                當(dāng)試圖使用session.load()方法裝載一個(gè)未被代理的對(duì)象,或者訪問(wèn)一個(gè)超出范圍的代理對(duì)象時(shí)。

                當(dāng)裝載一個(gè)未被正確取得的映射時(shí)。

                當(dāng)未被外鍵約束的外鍵字段中含有非法值時(shí)。

          檢查裝載使用的主鍵Id,并驗(yàn)證外鍵關(guān)系,以確定數(shù)據(jù)庫(kù)中已經(jīng)存在相應(yīng)的約束關(guān)系。堅(jiān)持“在一個(gè)Session中只處理一個(gè)事務(wù)”的原則。因?yàn)楫?dāng)在單一Session中使用多個(gè)事務(wù)時(shí)很容易犯錯(cuò)。尤其注意,在一個(gè)HibernateException已經(jīng)拋出后不要再操作Session。

           

           

          17問(wèn):錯(cuò)誤代碼:InvalidObjectException: Could not find a SessionFactory named: null

          答:這個(gè)錯(cuò)誤在以下幾種情況下經(jīng)常發(fā)生。

                試圖序列化一個(gè)已經(jīng)失效的Hibernate Session,然后在另外一個(gè)虛擬機(jī)中進(jìn)行反序列化。

                類裝載器被重置,例如在未重啟的application server或者Web container中重新部署程序。在使用Tomcat時(shí)會(huì)經(jīng)常遇到這個(gè)問(wèn)題,這是因?yàn)閍pplication server中一般使用JNDI來(lái)存儲(chǔ)SessionFactory,而在Tomcat或其他一些Web容器中,則是通過(guò)在context重載時(shí),關(guān)閉HttpSession序列化來(lái)實(shí)現(xiàn)的。這種實(shí)現(xiàn)方式會(huì)引起這個(gè)錯(cuò)誤發(fā)生。

           

           

          18問(wèn):錯(cuò)誤代碼:org.hibernate.HibernateException: CGLIB Enhancement failed: <classname>

          答:Hibernate 3的默認(rèn)方式是把所有類通過(guò)代理方式來(lái)進(jìn)行延遲加載。如果代碼中的類有一個(gè)私有無(wú)參的構(gòu)造器的話,Hibernate將無(wú)法在運(yùn)行時(shí)將項(xiàng)目代碼中的類作為子類裝載。為了避免這個(gè)錯(cuò)誤,類中的構(gòu)造器函數(shù)至少應(yīng)該在包內(nèi)可見。

           

           

          19問(wèn):為什么在Hibernate中添加、刪除、修改一個(gè)對(duì)象或Collection,但是數(shù)據(jù)庫(kù)中實(shí)際上沒有任何變化

          答:這個(gè)問(wèn)題經(jīng)常會(huì)困擾初學(xué)者。這是因?yàn)槿绻麤]有使用Hibernate的自動(dòng)事務(wù)處理,則必需顯式的提交事務(wù),操作才會(huì)在數(shù)據(jù)庫(kù)中執(zhí)行。

           

           

          20問(wèn):為什么保存一個(gè)父對(duì)象,而它的關(guān)聯(lián)對(duì)象沒有自動(dòng)儲(chǔ)存到數(shù)據(jù)庫(kù)里

          答:關(guān)聯(lián)對(duì)象必需顯式的調(diào)用session.save()(或session.persist()),或者在關(guān)聯(lián)的映射文件中加入cascade="all"或cascade="save-update"(或cascade="persist")才能夠自動(dòng)關(guān)聯(lián)執(zhí)行。

          posted on 2010-12-22 21:28 王康 閱讀(4181) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 洛宁县| 金门县| 长岛县| 息烽县| 新化县| 巩义市| 万安县| 西吉县| 安岳县| 双牌县| 鄂托克前旗| 集贤县| 延寿县| 泸州市| 桦甸市| 望江县| 呼图壁县| 开鲁县| 营山县| 纳雍县| 石棉县| 赤壁市| 太保市| 南投市| 六枝特区| 环江| 青铜峡市| 梧州市| 蒙城县| 榆树市| 加查县| 远安县| 宁夏| 广州市| 普陀区| 会泽县| 图片| 珠海市| 大荔县| 龙泉市| 文昌市|