posts - 108,comments - 56,trackbacks - 0
             1、用MyEclipse通過(guò)連接到數(shù)據(jù)庫(kù),可以生成Hibernate需要的POJO和對(duì)應(yīng)的映射文件。但是我生成的hbm.xml有問(wèn)題,會(huì)報(bào)錯(cuò)"could not load an entity"。后來(lái)找到了元兇
          <class name="hbm.pojo.Misuser" table="misuser" schema="informix" catalog="zzymis">
          把catalog="zzymis"去掉就OK了。

             2、Hibrenate保存數(shù)據(jù)失敗
             如果忘記提交事務(wù)會(huì)導(dǎo)致數(shù)據(jù)保存或者更新失敗,正確代碼如下:
             HibernateSessionFactory. getSession().beginTransaction();
             
          new hbm.pojo.StudySubjectDAO().merge(subject);
             HibernateSessionFactory. getSession().flush();
             HibernateSessionFactory. getSession().getTransaction().commit();

             3、Hibernate一對(duì)多的配置
          最好使用雙向關(guān)聯(lián)(假設(shè)Main->Detail)
          1)Main.java中加入:
             
          private Set< Detail > detail=new HashSet();
             然后加入get()和set()方法;
          2)Detail.java中加入:
             
          private Main main;
             然后加入get()和set()方法;另外別忘了重寫(xiě)equals()方法
              
          public boolean equals(Object object) {
                  
          if (object == null || !this.getClass().equals(object.getClass())) {
                      
          return false;
                  }

                  Detail other 
          = (Detail)object;
                  
          if(other.id==null||this.id==null)
                      
          return false;
                  
          if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) 
                  
          return false;
                  
          return true;
              }

          3)Main.hbm.xml中加入:
             
          <set name="detail" inverse="true" cascade="all">
                   
          <key column="mainId"></key>
                   
          <one-to-many class=" Detail"/>
             
          </set>
          4)Detail.hbm.xml中加入:
             
          <many-to-one name=" main " class=" Main" column=" mainId">
             
          </many-to-one>
             同時(shí)把mainId對(duì)應(yīng)的
          <property>……</property>刪掉
          5)操作:
             雙向設(shè)置:(調(diào)用setMain()setDetail())

             4、EJB中的getSingleResult()方法
              查找返回一個(gè)結(jié)果,是唯一的一個(gè)結(jié)果,當(dāng)getSingleResult()個(gè)方法被調(diào)用時(shí)執(zhí)行查詢。如果沒(méi)有結(jié)果返回,這個(gè)方法將會(huì)拋出javax.persistence.EntityNotFoundException運(yùn)行異常.如果找到多于一個(gè)結(jié)果, javax.persistence.NonUniqueResultException異常將會(huì)在運(yùn)行期間拋出.因?yàn)檫@兩個(gè)異常都是RuntimeException,例子中的代碼不需要完整的try/catch塊。

             5、Hibernate3的解決中文查詢問(wèn)題
             如果直接把查詢的參數(shù)放到sql語(yǔ)句中是查不出來(lái)的,比如:
             Query query
          =em.createQuery("select u from User u where u.name like '%"+myName+"%'"); 
             可以使用占位符或者設(shè)置參數(shù)的方法來(lái)查詢,例如:
             
          1)Query query=em.createQuery("select u from User u where u.name like ? "); 
               query.setString(
          0,"%"+myName+"%");
             
          2)Query query=em.createQuery("select u from User u where u.name like :name");
               query.setString("name","
          %"+myName+"%");

             6、Like的其他用法(正則)
             like '_heryl' :搜索以字母 heryl 結(jié)尾的所有六個(gè)字母的名稱(如 Cheryl、Sheryl)。
             
          like '[CK]ars[eo]n' :搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。
             
          like '[M-Z]inger' :搜索以字符串 inger 結(jié)尾、以從M到Z的任何單個(gè)字母開(kāi)頭的所有名稱如 。
             
          like 'M[^c]%' :搜索以字母 M 開(kāi)頭,并且第二個(gè)字母不是 c 的所有名稱(如 MacFeather)。 

             7、一對(duì)多(one-to-many)刪除不掉
             比如Main-to-Detail是one-to-many關(guān)系,在新增的時(shí)候可以通過(guò)persistMain()同時(shí)把多個(gè)Detail插入數(shù)據(jù)庫(kù),但是如果想刪除某個(gè)Main中的某幾個(gè)Detail時(shí),好像通過(guò)mergeMain()是無(wú)法做到的,通過(guò)mergeMain()可以更新Main的屬性,但是沒(méi)辦法刪除相應(yīng)的Detail,至少我是沒(méi)辦法做到。這時(shí),我一半都是寫(xiě)個(gè)方法單獨(dú)來(lái)刪除Detail,例如deleteDetailById()來(lái)一個(gè)個(gè)刪除。
           
             8、查詢返回多個(gè)實(shí)體Bean
             1)查詢(省略后的代碼)
             @PersistenceContext(unitName
          ="crm")
             
          private EntityManager em;
             
          public List getUserinfoTrace(){
              
          return em.createQuery("select new List(u,t)  from Userinfo u,Trace t where u.id=t.id").getResultList();
             }
             
          2)讀取(省略后的代碼)
             List
          <List> result=(List<List>)remote.getUserinfoTrace();
             
          for(List obj:result){
                Userinfo userinfo
          =(Userinfo)result.get(0);
                Trace trace
          =(Trace)result.get(1);
                ……
             }

             9、設(shè)置ID自增
          在用netbean生成的實(shí)體Bean后,需要手工加上自增注釋(@GeneratedValue(strategy = GenerationType.AUTO)
          例如:
          @Id
          @Column(name 
          = "id", nullable = false)
          @GeneratedValue(strategy 
          = GenerationType.AUTO)
          private Integer id;

             10、failed to lazily initialize a collection of role
             因?yàn)檠舆t加載導(dǎo)致的,但是我在EntityBean中使用fetch=FetchType.EAGER和FetchType.LAZY都無(wú)效,我的EntityBean是@OneToMany,最后只有在SessionBean的讀取EntityBean的方法中加入:
             if(main.getDetails()!=null)
                main.getDetails().size();
             
          return main;
             這樣總算解決問(wèn)題。
          posted on 2007-06-01 18:35 破繭而出 閱讀(1118) 評(píng)論(0)  編輯  收藏 所屬分類: Hibernate_EJB

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 英德市| 嘉峪关市| 台南县| 南昌市| 巴中市| 黄大仙区| 石家庄市| 濉溪县| 古交市| 蒙城县| 裕民县| 凉山| 桂阳县| 新营市| 孝昌县| 定襄县| 信宜市| 迁安市| 南陵县| 关岭| 建德市| 新田县| 兴文县| 措美县| 洛南县| 阜新| 清原| 吉安县| 金乡县| 万盛区| 安多县| 永昌县| 聂荣县| 永登县| 兴文县| 富锦市| 凤山市| 凤山县| 阳泉市| 凤冈县| 灵璧县|