Sammansatt enhetsmönster

Sammansatt enhet är ett designmönster för Java EE Software och det används för att modellera, representera och hantera en uppsättning sammanhängande beständiga objekt snarare än att representera dem som enskilda finkorniga entitetsbönor, och även en sammansatt enhetsböna representerar en graf över objekt.

Strukturera

Det finns ett antal strategier för att implementera sammansatta enhetsmönster. Detta mönster består huvudsakligen av sammansatta enheter, grovkorniga objekt och beroende objekt.

Composite entity pattern class diagram
Klassdiagram för sammansatt enhetsmönster


Sammansatt enhetskomponent

Sammansatt enhet är den grovkorniga entitetsbönan som kan vara det grovkorniga objektet, eller kan innehålla en referens till det grovkorniga objektet.

Grovkornigt föremål

Ett grovkornigt föremål är ett föremål med sin egen livscykel som hanterar sina egna relationer till andra föremål. Det kan vara ett objekt som ingår i den sammansatta enheten, eller så kan den sammansatta enheten i sig vara det grovkorniga objektet som innehåller beroende objekt.

Beroende objekt

Det är ett objekt, som kan innehålla andra beroende objekt (det kan finnas ett träd av objekt inom den sammansatta enheten), som beror på det grovkorniga objektet och som har sin livscykel som hanteras av det grovkorniga objektet.

Konsekvenser

Enligt Oracles beskrivning av mönstret inkluderar konsekvenserna att eliminera relationer mellan enheter, förbättra hanterbarheten genom att minska enhetsbönor, förbättra nätverksprestanda, minska databasschemaberoendet, öka objektgranulariteten, underlätta skapande av sammansatta överföringsobjekt och overhead av flernivåberoende objektgrafer .

Nackdelar

Den dödliga nackdelen är kravet på bean-managed persistent (BMP) böna . Detta innebär mer arbete för utvecklare och skapar några problem enligt följande:

  • att materialisera all data i en grovkornig enhet när den nås, är oacceptabelt dyrt
  • I Java måste implementeringen av ejbStore()-metoden vara tillräckligt smart för att undvika att utfärda alla uppdateringar som krävs för att bevara hela tillståndet för objektet, om inte data har ändrats i alla beständiga objekt.

Sammansatt enhetsmönster kan endast implementeras med hjälp av BMP eller genom att lägga till mer handkodad persistenslogik till behållarstyrda persistensbönor (CMP ) . Dessa båda tillvägagångssätt minskar underhållsbarheten.

Exempelkod

Exempelkod för en Professional Service Automation-applikation (PSA) där resursobjektet är implementerat via sammansatt enhetsmönster, kan se ut som följer (entiteten implementerar grovkornigt objekt):

 

 
 
 
 
 
 
 

     
      
     paket  corepatterns.apps.psa.ejb  ;  importera  corepatterns.apps.psa.core.*  ;  importera  corepatterns.apps.psa.dao.*  ;  importera  java.sql.*  ;  importera  javax.sql.*  ;  importera  java.util.*  ;  importera  javax.ejb.*  ;  importera  javax.naming.*  ;  public  class  ResourceEntity  implementerar  EntityBean  {  public  String  employeeId  ;  offentlig   
      
      
      
      
      
      
      
      
      
      String  efternamn  ;  public  String  firstName  ;  public  String  departmentId  ;  public  String  practiceGroup  ;  offentlig  Strängtitel  ;  _  offentlig  Strängbetyg  ;  _  offentlig  sträng  e-post  ;  offentlig  strängtelefon  ;  _  offentlig  strängcell  ;  _  public  String  personsökare  ;  offentlig  sträng  
    
    
      

    
      

    

      

     
     
         
             managerId  ;  // Samling av BlockOutTime-beroende objekt  offentlig  Samling  blockoutTimes  ;  // Samling av SkillSet-beroende objekt  offentliga  Collection  skillSets  ;  ...  privat  EntityContext  sammanhang  ;  // Entity Bean-metoder implementering  offentlig  String  ejbCreate  (  ResourceTO-  resurs  )  kastar  CreateException  {  try  {  this  .   
            
            
           
                
        
         

    
   anställdId  =  resurs  .  anställd-ID  ;  setResourceData  (  resurs  );  getResourceDAO  ().  skapa  (  resurs  );  }  catch  (  Exception  ex  )  {  throw  new  EJBException  (  "Reason:"  +  ...);  }  returnera  detta  .  anställd-ID  ;  }  offentlig  sträng  ejbFindByPrimaryKey   
      
         
         
               
              
                
           
                
         (  String  primaryKey  )  kastar  FinderException  {  booleskt  resultat  ;  försök  {  ResourceDAO  resourceDAO  =  getResourceDAO  ();  resultat  =  resursDAO  .  selectByPrimaryKey  (  primaryKey  );  }  catch  (  Exception  ex  )  {  throw  new  EJBException  (  "Reason:"  +  ...);  } 
          
             
        
         
              
        
    
    
       
         
            
                

                   
                 if  (  resultat  )  {  retur  primärnyckel  ;  }  else  {  throw  new  ObjectNotFoundException  (...);  }  }  public  void  ejbRemove  ()  {  try  {  // Remove dependent objects  if  (  this  .  skillSets  !=  null  )  {  SkillSetDAO  skillSetDAO  =  getSkillSetDAO  ();  skillSetDAO  . 
                
                  
            
                
                   
                        
                
                
                  setResourceID  (  employeeId  );  skillSetDAO  .  raderaAlla  ();  skillSets  =  null  ;  }  if  (  denna  .  blockoutTime  !=  null  )  {  BlockOutTimeDAO  blockouttimeDAO  =  getBlockOutTimeDAO (  );  blockouttimeDAO  .  setResourceID  (  employeeId  );  blockouttimeDAO  .  raderaAlla  ();  blockOutTimes  =  
            

            
                
                
            
           
              
           
             null  ;  }  // Ta bort resursen från det beständiga arkivet  ResourceDAO  resourceDAO  =  new  ResourceDAO  (  employeeId  );  resursDAO  .  ta bort  ();  }  catch  (  ResourceException  ex  )  {  throw  new  EJBException  (  "Reason:"  +  ...);  }  catch  (  BlockOutTimeException  ex  )  {  throw   
           
            
        
    
        
    
          
    
    
       
          
    
    
     nytt  EJBEundantag  (  "Anledning:"  +  ...);  }  catch  (  Undantag  undantag  )  {  ...  }  }  public  void  setEntityContext  (  EntityContext  context  )  {  this  .  sammanhang  =  sammanhang  ;  }  public  void  unsetEntityContext  ()  {  context  =  null  ;  }  offentlig    
          
    
    
       
          
    
    
       
         
            
               
             void  ejbActivate  ()  {  employeeId  =  (  String  )  context  .  getPrimaryKey  ();  }  public  void  ejbPassivate  ()  {  employeeId  =  null  ;  }  public  void  ejbLoad  ()  {  try  {  // ladda resursinformationen från  ResourceDAO  resourceDAO  =  getResourceDAO (  );  setResourceData  ((  
                
            
            
            
           
                
        
    
    
       
         
            
             ResourceTO  )  resourceDAO  .  load  (  ployerId  ));  // Ladda andra beroende objekt, om nödvändigt  ...  }  catch  (  Exception  ex  )  {  throw  new  EJBException  (  "Reason:"  +  ...);  }  }  public  void  ejbStore  ()  {  try  {  // Store resursinformation  getResourceDAO  ().  uppdatera  ( 

            
            
           
                
           
                
        
        
    
       getResourceData  ());  // Lagra beroende objekt efter behov  ...  }  catch  (  SkillSetException  ex  )  {  throw  new  EJBException  (  "Reason:"  +  ...);  }  catch  (  BlockOutTimeException  ex  )  {  throw  new  EJBException  (  "Reason:"  +  ...);  }  ...  }  public  void  ejbPostCreate   
    

    
       
        
            
                

        
          
          
         (  ResourceTO-  resurs  )  {  }  // Metod för att hämta resursöverföringsobjekt  public  ResourceTO  getResourceTO  ()  {  // skapa ett nytt resursöverföringsobjekt  ResourceTO  resourceTO  =  new  ResourceTO  (  employeeId  );  // kopiera alla värden  resourceTO  .  efternamn  =  efternamn  ;  resurs TO  .  förnamn  =  förnamn  ;  resursTO   
        
         
    

        
        
          
          
        
    

    
     .  departmentId  =  departmentId  ;  ...  returnera  resursTO  ;  }  public  void  setResourceData  (  ResourceTO  resourceTO  )  {  // kopiera värden från Transfer Object in i entity bean  employeeId  =  resourceTO  .  anställd-ID  ;  efternamn  =  resursTO  .  efternamn  ;  ...  }  // Metod för att göra beroende överföringsobjekt  offentliga    
        
        

             
    
    

    
    

    
        
      
        
        
          Collection  getSkillSetsData  ()  {  // Om skillSets inte laddas, ladda det först.  // Se implementering av Lazy Load-strategin.  returnera  färdigheter  ;  }  ...  // andra få och ställ in metoder efter behov  ...  // Entity bean affärsmetoder  public  void  addBlockOutTimes  (  Collection  moreBOTs  )  throws  BlockOutTimeException  {  // Note: moreBOTs is a collection of  // BlockOutTimeTO objects  try  { 
               
              
                    
                                                    
                   
                    
                    
                     Iterator  moreIter  =  moreBOTs  .  iterator  ();  while  (  moreIter  .  hasNext  ())  {  BlockOutTimeTO  botTO  =  (  BlockOutTimeTO  )  moreIter  .  nästa  ();  if  (  !  (  blockOutTimeExists  (  botTO  )))  {  // lägg till BlockOutTimeTO till samlingen  botTO  .  setNew  ();  blockOutTime  . 
                  
                    
                      
                
            
           
              
        
    

        
       add  (  botTO  );  }  else  {  // BlockOutTimeTO existerar redan, kan inte lägga till  throw  new  BlockOutTimeException  (...);  }  }  }  catch  (  Undantag  undantag  )  {  throw  new  EJBException  (...);  }  }  public  void  addSkillSet  (  Collection  moreSkills  )  kastar  SkillSetException  { 
        
        
    

    

        
      
         
               
               
               // liknande addBlockOutTime()-implementering  ...  }  ...  public  void  updateBlockOutTime  (  Collection  updBOTs  )  kastar  BlockOutTimeException  {  try  {  Iterator  botIter  =  blockOutTimes  .  iterator  ();  Iterator  updIter  =  updBOTs  .  iterator  ();  while  (  updIter  .  hasNext  ())  { 
                   
                    
                  
                       
                         
                    
                      
                         BlockOutTimeTO  botTO  =  (  BlockOutTimeTO  )  updIter  .  nästa  ();  while  (  botIter  .  hasNext  ())  {  BlockOutTimeTO  existentBOT  =  (  BlockOutTimeTO  )  botIter  .  nästa  ();  // jämför nyckelvärden för att hitta BlockOutTime  if  (  existerande BOT  .  är lika med  (  botTO  ))  {  // Hittade BlockOutTime i samlingen 
                        
                         
                         
                          
                    
                
            
            
              
        
    

        // ersätt gamla BlockOutTimeTO med en ny  botTO  .  setDirty  ();  //modifierad gammal beroende  botTO  .  resetNew  ();  //inte en ny beroende  existerande BOT  =  botTO  ;  }  }  }  }  catch  (  Exception  exc  )  {  throw  new  EJBException  (...);  }  }  public  void  updateSkillSet  (  Collection  updSkills  )  
      
        
        
    

    

 kastar  CommitmentException  {  // liknande updateBlockOutTime...  ...  }  ...  } 

Se även