<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ようこそ、皆さん

    開心幸福生活每一天。。。

    JPLT2が合格しましたが、會話と聴力はまだまだです。これからも、がんばれ!!!

    hibernateの20よく見える質(zhì)問

    轉(zhuǎn)載: Hibernate常見的20個問題
    1問:Hibernate初始化時總是報錯:java.lang.NoClassDefFoundError
    Hibernate初始化時出現(xiàn)出錯代碼:
    java.lang.NoClassDefFoundError: net/sf/ehcache/CacheException

    答:這是新手常見問題。是因為使用默認設(shè)置時,Hibernate文檔里指出的Hibernate庫不完整,缺少ehcache.jar(用于支持Ehcache的相關(guān)文件)。配置中加入以上文件,就可以避免初始化時出現(xiàn)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);
    ......
    出現(xiàn)錯誤碼:
    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問:使用開發(fā)工具Elipse,運行時總報java.lang.NoClassDefFoundError: org/ Hibernate/Session異常
    使用Elipse,所用包是hibernte 3,發(fā)現(xiàn)在Action中每次執(zhí)行到:
    session=HibernateSessionFactory.currentSession();
    時,出現(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é)者常見問題,原因是沒有導(dǎo)入hibernate 3.jar包,雖然把hibernate 3.jar寫入了Classpath,但部署的時候卻沒有拷貝到lib下面,可以手動拷貝進入。
    4問:執(zhí)行如下方法時,發(fā)生"No CurrentSessionContext configured"錯誤
    執(zhí)行如下方法時,發(fā)生"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的環(huán)境下(例如Jboss),在session-factory段加入:
    <property name="Hibernate.current_session_context_class">jta</property>
    在不集成Hibernate的環(huán)境下(例如使用JDBC的獨立應(yīng)用程序),在session-factory段加入:
    <property name="Hibernate.current_session_context_class">thread</property>就可以解決這個問題。
    5問:移植Jboss 4下配置Hibernate出錯
    在Tomcat 5下配置Hibernate成功,但移植到Jboss 4下出現(xiàn)了很多問題。已在deploy目錄下放置了Hibernate-service.xml和Hibernate.cfg.xml文件,但啟動服務(wù)器仍然報錯   如下。
    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的常見問題。在Jboss的某個war包中使用Hibernate應(yīng)該將Hibernate.cfg.xml文件放置到%war_dir%WEB-INF/classes中,但是Hibernate的factory仍然可能會提示Hibernate.cfg.xml not found。此問題解決方法如下。
    由于Jboss已經(jīng)集成了Hibernate,在deploy\lib文件夾中hibernate2.jar的文件已經(jīng)存在了一個jar包,所以實際的war中可能使用了shar的hibernate2.jar,由于ClassLoader只會在hibernate2.jar的同級及上級目錄中尋找hibernate.cfg.xml,所以導(dǎo)致Hibernate并沒有去查找%war_dir%WEB-INF/classes中的Hibernate.cfg.xml文件。刪除deploy/lib下的hibernate2.jar或者使用絕對路徑指定Hibernate.cfg.xml可以解決。除非有其他需求,否則在Jboss下部署Hibernate與在Tomcat下是一樣的,并不需要加其他配置文件。
    6問:到底在哪里使用cascade="..."?
    答:cascade屬性并不是多對多關(guān)系一定要用的,用了它只是插入或刪除對象時更方便一些,只要在cascade的源頭上插入或刪除,所有cascade的關(guān)系就會被自動插入或刪除。其中unsaved-value是個很重要的屬性,Hibernate是通過這個屬性來判斷這個對象應(yīng)該“save”還是“update”,如果這個對象的id是unsaved-value,那說明這個對象不是persistence object,要save(insert);如果id是非unsaved-value,那說明這個對象是persistence object(數(shù)據(jù)庫中已存在),只要update就行了。
    7問:到底在哪里使用inverse="true"
    答:inverse屬性默認是false,就是說關(guān)系的兩端都來維護關(guān)系。這個意思就是說,如有3個表:Student、Teacher和TeacherStudent,Student對象和Teacher對象是多對多關(guān)系,這個關(guān)系由TeacherStudent表來表現(xiàn)。
    那么什么時候插入或刪除TeacherStudent表中的記錄呢。用Hibernate時,不會顯式的對TeacherStudent表操作,對TeacherStudent的操作是Hibernate自動做的。Hibernate就是hbm文件中指定的是“誰”維護關(guān)系,在插入或刪除時,就會觸發(fā)對關(guān)系表的操作。前提是“誰”這個對象已經(jīng)知道這個關(guān)系,就是說關(guān)系另一頭的對象已經(jīng)set或是add到“誰”這個對象里來。
    前面說過inverse默認是false,就是關(guān)系的兩端都維護關(guān)系,對其中任一個操作都會觸發(fā)對表的操作。當(dāng)在關(guān)系的一頭,如Student中的bag或set中用了inverse="true"時,就代表關(guān)系是由另一端維護的(Teacher)。就是說當(dāng)插入Student時,不會操作TeacherStudent表,即使Student已經(jīng)知道了關(guān)系。只有Teacher插入或刪除時才會觸發(fā)對關(guān)系表的操作。所以,關(guān)系的兩頭都用inverse="true"是不對的,會導(dǎo)致任何操作都不觸發(fā)對關(guān)系表的操作。當(dāng)兩端都是inverse="false"或是default值時,在代碼中對關(guān)系顯式的維護也是不對的,會導(dǎo)致在關(guān)系表中插入兩次關(guān)系。
    8問:Cascade和Inverse有什么區(qū)別?
    答:可以這樣理解,Cascade定義的是關(guān)系兩端對象到對象的級聯(lián)關(guān)系;而Inverse定義的是關(guān)系和對象的級聯(lián)關(guān)系。
    9問:在刪除操作時報錯:net.sf.Hibernate.ObjectDeletedException:deleted object would be re-saved by cascade (remove deleted object from associations)
    答:要刪除關(guān)系的一頭時(如,要刪除一個已經(jīng)和Student對象有關(guān)聯(lián)的Teacher對象),當(dāng)tx.commit()時才會拋出這個異常。防止出現(xiàn)這個異常的方法如下。
    *     在Student端不用cascade。
    *     或是用cascade的話,就顯式的刪除對像中的關(guān)系。
    *     在Teacher端要用cascade。
    10問:出現(xiàn)net.sf.Hibernate.HibernateException: identifier of an instance of my. MyObject altered from N to N異常
    答:這個異常不是多對多關(guān)系中常遇到的,但是這個異常的提示容易讓人混淆。這是因為在Java對象中,id定義和hbm文件的不一樣。如Java中用long,而hbm中用type= "integer"。
    11問:為什么在向數(shù)據(jù)庫中插入長字符串時候部分自動丟失
    在向數(shù)據(jù)庫中增加一條新的條目時,發(fā)現(xiàn)如果文字(有英文字母,也有漢字)數(shù)量特別大,超過1000個,則每次通過Hibernate,向一個String類型的字段中增加數(shù)據(jù)時,只有幾百個字可以增加進去,其他的自動丟失了。
    答:這是由于字段長度設(shè)置不合理造成的。可以根據(jù)字符串實際長度考慮使用Text、LongText、或者Blob等字段類型。不同數(shù)據(jù)庫的字段類型稍有不同,可以參考相關(guān)手冊。另外需要注意的是一個漢字占用兩個字節(jié)長度。
    12問:為什么采用Hibernate的批量刪除方法來刪除大批量的記錄數(shù)據(jù)時速度特別慢
    答:在使用Hibernate版本2.X時,不推薦采用Hibernate的批量刪除方法來刪除大量記錄。原因是,Hibernate會執(zhí)行1條查詢語句,另外還有滿足條件的多條刪除語句,而不是一次執(zhí)行一個刪除語句,所以當(dāng)待刪除的數(shù)據(jù)很多時,會有很大的性能瓶頸。而對于Hibernate 3.0以上的版本,則不存這個問題。
    13問:升級Hibernate 3后在導(dǎo)入hbm映射文件時為什么非常非常慢
    原先在Hibernate 2中,程序的速度是非常快的。當(dāng)環(huán)境順利從Hibernate 2升級到Hibernate 3后,發(fā)布時在Tomcat的控制臺中發(fā)現(xiàn):Hibernate 3裝載hbm映射文件時非常慢,差不多10秒鐘才能裝載一個hbm文件。
    答:通過在Hibernate的源代碼中設(shè)置斷點,可以發(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é)論,問題的癥結(jié)出在這一條語句:
    org.dom4j.Document doc = xmlHelper.createSAXReader()
    可以判斷這是在XML文件裝載初始化時發(fā)生的錯誤,仔細檢查XML文件,可以發(fā)現(xiàn)這是XML的第一行聲明dtd的錯誤,因為以前使用的是Hibernate 2,所以hbm文件的dtd指向的是版本2,而升級Hibernate 3后,沒有把老的hbm映射文件換成版本3。在更換為3版本后,此問題得到解決。
    14問:為什么Hibernate 3中的HQL無法查詢漢字
    使用同樣的代碼和配置文件,在Hibernate 2上完全沒有問題,在Hibernate 3中,使用如下HQL查詢,無法得到正確的結(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升級到Hibernate 3確實會出現(xiàn)漢字亂碼問題。在控制臺中可以看到,SQL的漢字部分變成了亂碼:
    [DEBUG] 2005-08-14 14:33:58 org.hibernate.SQL - "select story0_.content from story as story0_ where story0_.title like '%&–°é—&&Ѝ&€?'
    在Hibernate中,查詢時應(yīng)盡量使用占位符的寫法(如下),這樣既可以避免亂碼問題,又可以避免潛在的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
    答:在以下幾種情況下,該錯誤可能會發(fā)生。
    *     當(dāng)試圖使用session.load()方法裝載一個未被代理的對象,或者訪問一個超出范圍的代理對象時。
    *     當(dāng)裝載一個未被正確取得的映射時。
    *     當(dāng)未被外鍵約束的外鍵字段中含有非法值時。
    檢查裝載使用的主鍵Id,并驗證外鍵關(guān)系,以確定數(shù)據(jù)庫中已經(jīng)存在相應(yīng)的約束關(guān)系。堅持“在一個Session中只處理一個事務(wù)”的原則。因為當(dāng)在單一Session中使用多個事務(wù)時很容易犯錯。尤其注意,在一個HibernateException已經(jīng)拋出后不要再操作Session。
    17問:錯誤代碼:InvalidObjectException: Could not find a SessionFactory named: null
    答:這個錯誤在以下幾種情況下經(jīng)常發(fā)生。
    *     試圖序列化一個已經(jīng)失效的Hibernate Session,然后在另外一個虛擬機中進行反序列化。
    *     類裝載器被重置,例如在未重啟的application server或者Web container中重新部署程序。在使用Tomcat時會經(jīng)常遇到這個問題,這是因為application server中一般使用JNDI來存儲SessionFactory,而在Tomcat或其他一些Web容器中,則是通過在context重載時,關(guān)閉HttpSession序列化來實現(xiàn)的。這種實現(xiàn)方式會引起這個錯誤發(fā)生。
    18問:錯誤代碼:org.hibernate.HibernateException: CGLIB Enhancement failed: <classname>
    答:Hibernate 3的默認方式是把所有類通過代理方式來進行延遲加載。如果代碼中的類有一個私有無參的構(gòu)造器的話,Hibernate將無法在運行時將項目代碼中的類作為子類裝載。為了避免這個錯誤,類中的構(gòu)造器函數(shù)至少應(yīng)該在包內(nèi)可見。
    19問:為什么在Hibernate中添加、刪除、修改一個對象或Collection,但是數(shù)據(jù)庫中實際上沒有任何變化
    答:這個問題經(jīng)常會困擾初學(xué)者。這是因為如果沒有使用Hibernate的自動事務(wù)處理,則必需顯式的提交事務(wù),操作才會在數(shù)據(jù)庫中執(zhí)行。
    20問:為什么保存一個父對象,而它的關(guān)聯(lián)對象沒有自動儲存到數(shù)據(jù)庫里
    答:關(guān)聯(lián)對象必需顯式的調(diào)用session.save()(或session.persist()),或者在關(guān)聯(lián)的映射文件中加入cascade="all"或cascade="save-update"(或cascade="persist")才能夠自動關(guān)聯(lián)執(zhí)行。


    快快樂樂、認認真真生活才是真。

    posted on 2007-09-19 14:38 鮑佩 閱讀(322) 評論(0)  編輯  收藏 所屬分類: hibernate

    平平淡淡,認認真真生活才是真。
    主站蜘蛛池模板: 亚洲欧洲自拍拍偷精品 美利坚 | 亚洲男人第一无码aⅴ网站| 在线播放高清国语自产拍免费| 国产福利视精品永久免费| 四虎免费影院ww4164h| 青青在线久青草免费观看| 免费精品国偷自产在线在线 | 精品无码人妻一区二区免费蜜桃| a级大片免费观看| 国产拍拍拍无码视频免费| 成全视频高清免费观看电视剧| 国产日韩一区二区三免费高清| 免费国产叼嘿视频大全网站| 日韩插啊免费视频在线观看| 亚洲精品视频在线观看免费| 免费大片黄在线观看yw| 大学生美女毛片免费视频| 国产传媒在线观看视频免费观看| 亚洲福利精品一区二区三区| 亚洲综合av永久无码精品一区二区 | 美女被吸屁股免费网站| 一区免费在线观看| 免费无码又爽又刺激网站 | 国产精品无码亚洲精品2021 | 亚洲一级毛片免费在线观看| 亚洲综合色丁香婷婷六月图片| 国产精品无码亚洲精品2021| 中文字幕a∨在线乱码免费看| 久草福利资源网站免费| 丁香花免费完整高清观看| 男人的天堂亚洲一区二区三区 | 国产网站免费观看| 亚洲综合亚洲综合网成人| 国产AV无码专区亚洲AV毛网站| 亚洲短视频在线观看| 亚洲乱码国产乱码精华| 久久国产福利免费| h在线观看视频免费网站| 最好免费观看韩国+日本| 亚洲午夜福利精品无码| 337p日本欧洲亚洲大胆色噜噜|