posts - 0, comments - 77, trackbacks - 0, articles - 356
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          EJB初學(xué)日記(6)

          Posted on 2007-09-18 21:31 semovy 閱讀(204) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): EJB
          實(shí)體BEAN的關(guān)聯(lián)

          今天自己寫(xiě)了一個(gè)例子,有關(guān)實(shí)體BEAN的關(guān)聯(lián)問(wèn)題,我寫(xiě)的這個(gè)例子是一對(duì)多的情況,一是人,多是狗,一個(gè)人可以養(yǎng)多條狗,每條狗都必須有一個(gè)主人,在刪除主人的時(shí)候,狗就沒(méi)有存在的必要了,所以狗也要跟著刪除,可是刪除狗的時(shí)候,主人卻可以在.一開(kāi)始我實(shí)現(xiàn)的時(shí)候,刪除狗的操作是錯(cuò)誤的,我以為直接把Person里面的Dog刪掉,然后更新Person就可以了,誰(shuí)知不是這樣的,你在增加了Person中的狗的時(shí)候,你更新Person就可以把狗加進(jìn)來(lái)了,可是當(dāng)你把Person里面的狗刪除掉時(shí),再更新Person,數(shù)據(jù)庫(kù)里面的狗卻不會(huì)少.而要你顯示的調(diào)用em.remove()去刪除你想刪除的狗,并且你對(duì)這狗不能設(shè)置為級(jí)聯(lián)刪除,否則你刪除狗的時(shí)候把人也刪掉了,這當(dāng)然不是我們希望看到的.

          下面附上代碼

          package com.hadeslee.session;   
             
           
          import com.hadeslee.entity.Person;   
           
          import java.util.List;   
           
          import javax.ejb.Remote;   
             
             
           
          /**  
            * This is the business interface for PersonDAO enterprise bean.  
           
          */  
           @Remote  
           
          public interface PersonDAORemote {   
              
          public void insertPerson(Person p);   
              
          public List getAllPersons();   
              
          public Person findPerson(long id);   
              
          public void deletePerson(long id);   
           }   

           package com.hadeslee.session;   
             
           
          import com.hadeslee.entity.Dog;   
           
          import com.hadeslee.entity.Person;   
           
          import java.util.List;   
           
          import javax.ejb.Remote;   
             
             
           
          /**  
            * This is the business interface for PersonToDogs     enterprise bean.  
            
          */  
           @Remote  
          public interface PersonToDogsRemote extends PersonDAORemote{   
               
          public void addDog(Person p,Dog dog);   
               
          public Person removeDog(Person p,Dog dog);   
               
          public List getDogs(Person p);   
               
          public Person getOwner(Dog dog);   
           }   

             /*  
             * PersonDAOBean.java  
             *  
             * Created on 2006年12月13日, 下午3:53  
             *  
             * To change this template, choose Tools | Template Manager  
             * and open the template in the editor.  
             
          */  
              
            
          package com.hadeslee.session;   
              
            
          import com.hadeslee.entity.Person;   
          import java.util.List;   
           
          import javax.ejb.Stateful;   
          import javax.persistence.Query;   
           
          import javax.persistence.EntityManager;   
           
          import javax.persistence.PersistenceContext;   
             
           
          /**  
            *  
            * 
          @author lbf  
            
          */  
           @Stateful  
          public class PersonDAOBean implements com.hadeslee.session.PersonDAORemote {   
             @PersistenceContext  
              
          protected EntityManager em;   
            
          /** Creates a new instance of PersonDAOBean */  
              
          public PersonDAOBean() {   
              }   
            
              
          public void insertPerson(Person p) {   
                 em.persist(p);   
                 System.out.println(
          "保存成功");   
             }   
           
              
          public List getAllPersons() {   
                Query query
          =em.createQuery("select p from Person p order by p.id");   
                    
          return query.getResultList();   
              }   
             
               
          public Person findPerson(long id) {   
                  
          return em.find(Person.class,id);   
                 }   
                 
          public void deletePerson(long id){   
                   em.remove(em.find(Person.
          class,id));   
               }   
               
          }  

             1.  /*  
             2.  * PersonToDogsBean.java  
             3.  *  
             4.  * Created on 2006年12月13日, 下午4:50  
             5.  *  
             6.  * To change this template, choose Tools | Template Manager  
             7.  * and open the template in the editor.  
             8.  
          */  
             
          9.   
            
          10package com.hadeslee.session;   
            
          11.   
            
          12import com.hadeslee.entity.Dog;   
            
          13import com.hadeslee.entity.Person;   
            
          14import java.util.List;   
            
          15import javax.ejb.Stateless;   
            
          16import javax.persistence.Query;   
            
          17.   
            
          18/**  
            19.  *  
            20.  * 
          @author lbf  
            21.  
          */  
            
          22. @Stateless  
            
          23public class PersonToDogsBean extends PersonDAOBean implements com.hadeslee.session.PersonToDogsRemote {   
            
          24.        
            
          25.     /** Creates a new instance of PersonToDogsBean */  
            
          26.     public PersonToDogsBean() {   
            
          27.     }   
            
          28.   
            
          29.     public void addDog(Person p, Dog dog) {   
            
          30.         p.addDog(dog);   
            
          31.         em.merge(p);   
            
          32.     }   
            
          33.   
            
          34.     public Person removeDog(Person p, Dog dog) {   
            
          35.         //em.remove(dog);   
            36.         p.removeDog(dog);   
            
          37.         System.out.println("此時(shí)P的大小是:"+p.getDogs().size());   
            
          38.         em.merge(p);   
            
          39.         return p;   
            
          40.     }   
            
          41.   
            
          42.     public List getDogs(Person p) {   
            
          43.         return p.getDogs();   
            
          44.     }   
            
          45.   
            
          46.     public Person getOwner(Dog dog) {   
            
          47.         Query query=em.createQuery("select p from Person p where p.id=?1");   
            
          48.         query.setParameter(1,dog.getOwner().getId());   
            
          49.         return (Person)query.getSingleResult();   
            
          50.     }   
            
          51.        
            
          52. } 
          目前的代碼是不能正常刪除的,要正常刪除狗的話(huà),必須把em.remove() 那句話(huà)還原,然把再把em.merge()那句話(huà)注釋起來(lái)才行還有一個(gè)現(xiàn)象,那就是我在對(duì)遠(yuǎn)程對(duì)象進(jìn)行了操作以后,并不會(huì)反映到我的本地對(duì)象,比如我調(diào)用了刪除人里面的一條狗,在遠(yuǎn)程或者在數(shù)據(jù)庫(kù)里面確實(shí)是刪掉了,可是我在調(diào)用人的時(shí)候,里面還是有那么的狗,這樣就會(huì)產(chǎn)生不同步的現(xiàn)象,為了消除這種現(xiàn)象,我把接口寫(xiě)了一個(gè),改為進(jìn)行了刪除操作的時(shí)候,它會(huì)再次返回Person對(duì)象,這個(gè)時(shí)候就可以保證遠(yuǎn)程對(duì)象和本地對(duì)象的一致性了. 增加代碼沒(méi)寫(xiě),所以每次增加了狗后,調(diào)用Person對(duì)象時(shí),依然是增加前一樣的,也就是說(shuō),當(dāng)我持有了遠(yuǎn)程對(duì)象發(fā)過(guò)來(lái)的本地對(duì)象后,如果我不對(duì)其進(jìn)行操作,無(wú)論你怎么調(diào)用遠(yuǎn)程方法,此方法會(huì)對(duì)其有影響的,JVM都不會(huì)返回一個(gè)最新的給你,而你用的永遠(yuǎn)是第一次傳過(guò)來(lái)的那個(gè)以象,所以,在遠(yuǎn)程對(duì)象傳輸中,必須要注意同步性,要么就每次都從遠(yuǎn)程去取最新的對(duì)象,要么就先對(duì)本地對(duì)象做同樣的操作,比如前面的addDog動(dòng)作,先在本地執(zhí)行一遍,然后遠(yuǎn)程執(zhí)行遠(yuǎn)程的,這樣就可以同步了,不過(guò)我覺(jué)得如果是網(wǎng)絡(luò)允許的情況下,還是每次對(duì)對(duì)象操作后都能返回最新的對(duì)象好一些,免得手工去保持和遠(yuǎn)程對(duì)象的同步,這樣不可靠.
           一對(duì)多目前只看到了這么多,接下來(lái)要看一下多對(duì)多的情況.
          主站蜘蛛池模板: 嘉定区| 上犹县| 湛江市| 绍兴市| 驻马店市| 甘德县| 天峻县| 铜山县| 灌阳县| 富锦市| 确山县| 芜湖县| 东乡县| 富源县| 夏津县| 平顺县| 田阳县| 泰安市| 临汾市| 新田县| 新闻| 奇台县| 大新县| 长岭县| 贵港市| 屯留县| 资中县| 巨鹿县| 平远县| 雷山县| 阿拉善右旗| 衡山县| 若尔盖县| 罗城| 滕州市| 余庆县| 通江县| 炎陵县| 莱西市| 凤城市| 南陵县|