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.
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... ... } ... }