Složený vzor entity - Composite entity pattern
Složená entita je Java EE Softwarový návrhový vzor a používá se k modelování, reprezentaci a správě sady vzájemně souvisejících perzistentních objektů, spíše než k jejich reprezentaci jako jednotlivých jemnozrnných entitních fazolí, a také složená entita fazole představuje graf objektů.[1]
Struktura
Existuje řada strategií pro implementaci vzoru složených entit. Tento vzor tvoří hlavně kompozity složené entity, hrubozrnného objektu a závislých objektů.[1]

Kompozitní složka entity
Složená entita je fazole hrubozrnné entity, která může být hrubozrnným objektem nebo může obsahovat odkaz na hrubozrnný objekt.[1]
Hrubozrnný objekt
Hrubozrnný objekt je objekt s vlastním životním cyklem, který spravuje své vlastní vztahy s jinými objekty. Může to být objekt obsažený ve složené entitě, nebo samotná složená entita může být hrubozrnný objekt, který obsahuje závislé objekty.[1]
Závislé objekty
Jedná se o objekt, který může obsahovat další závislé objekty (ve složené entitě může být strom objektů), který závisí na hrubozrnném objektu a jeho životní cyklus je řízen hrubozrnným objektem.[1]
Důsledky
Podle popisu vzoru Oracle patří mezi důsledky vyloučení vztahů mezi entitami, zlepšení spravovatelnosti snížením počtu entit fazole, zlepšení výkonu sítě, snížení závislosti na schématu databáze, zvýšení zrnitosti objektu, usnadnění vytváření složeného objektu přenosu a režie grafů víceúrovňových závislých objektů .[1]
Nevýhody
Fatální nevýhodou je požadavek na fazole spravované trvalé (BMP) fazole. To vyžaduje více práce pro vývojáře a vytvoří se následující problémy:
- zhmotnění všech dat v hrubozrnné entitě, kdykoli je přístupné, je nepřijatelně nákladné
- v Jáva, implementace metody ejbStore () musí být dostatečně chytrá, aby se zabránilo vydávání všech aktualizací potřebných k přetrvávání celého stavu objektu, pokud se data nezměnila ve všech trvalých objektech.
Vzor složené entity lze implementovat pouze pomocí BMP nebo přidáním více ručně kódované logiky perzistence do kontejneru spravované perzistence (CMP) fazole. Oba tyto přístupy snižují udržovatelnost.[2]
Ukázkový kód
Ukázkový kód pro aplikaci Professional Service Automation (PSA), ve které je objekt prostředku implementován prostřednictvím složeného vzoru entity, může vypadat takto (entita implementuje hrubozrnný objekt):
balík corepatterns.apps.psa.ejb;import corepatterns.apps.psa.core. *;import corepatterns.apps.psa.dao. *;import java.sql. *;import javax.sql. *;import java.util. *;import javax.ejb. *;import javax.naming. *;veřejnost třída ResourceEntity nářadí EntityBean { veřejnost Tětiva employeeId; veřejnost Tětiva příjmení; veřejnost Tětiva jméno; veřejnost Tětiva ID oddělení; veřejnost Tětiva skupina praxe; veřejnost Tětiva titul; veřejnost Tětiva školní známka; veřejnost Tětiva e-mailem; veřejnost Tětiva telefon; veřejnost Tětiva buňka; veřejnost Tětiva pager; veřejnost Tětiva managerId; // Sbírka objektů závislých na BlockOutTime veřejnost Sbírka časy blokování; // Sbírka závislých objektů SkillSet veřejnost Sbírka sady dovedností; ... soukromé EntityContext kontext;// Implementace metod Entity Beanveřejnost Tětiva ejbCreate(ResourceTO zdroj) hodí CreateException { Snaž se { tento.employeeId = zdroj.employeeId; setResourceData(zdroj); getResourceDAO().vytvořit(zdroj); } chytit(Výjimka např) { házet Nový EJBException("Důvod:" + ...); } vrátit se tento.employeeId;} veřejnost Tětiva ejbFindByPrimaryKey(Tětiva primární klíč) hodí FinderException { booleovský výsledek; Snaž se { ResourceDAO resourceDAO = getResourceDAO(); výsledek = resourceDAO.selectByPrimaryKey(primární klíč); } chytit(Výjimka např) { házet Nový EJBException("Důvod:" + ...); } -li (výsledek) { vrátit se primární klíč; } jiný { házet Nový ObjectNotFoundException(...); } } veřejnost prázdnota ejbOdebrat() { Snaž se { // Odebrání závislých objektů -li (tento.sady dovedností != nula) { SkillSetDAO skillSetDAO = getSkillSetDAO(); skillSetDAO.setResourceID(employeeId); skillSetDAO.smazat všechny(); sady dovedností = nula; } -li (tento.blockoutTime != nula) { BlockOutTimeDAO blockouttimeDAO = getBlockOutTimeDAO(); blockouttimeDAO.setResourceID(employeeId); blockouttimeDAO.smazat všechny(); blockOutTimes = nula; } // Odebrání prostředku z trvalého úložiště ResourceDAO resourceDAO = Nový ResourceDAO(employeeId); resourceDAO.vymazat(); } chytit(ResourceException např) { házet Nový EJBException("Důvod:"+...); } chytit(BlockOutTimeException např) { házet Nový EJBException("Důvod:"+...); } chytit(Výjimka výjimka) { ... } } veřejnost prázdnota setEntityContext(EntityContext kontext) { tento.kontext = kontext; } veřejnost prázdnota unsetEntityContext() { kontext = nula; } veřejnost prázdnota ejbActivate() { employeeId = (Tětiva)kontext.getPrimaryKey(); } veřejnost prázdnota ejbPassivate() { employeeId = nula; } veřejnost prázdnota ejbLoad() { Snaž se { // načte informace o zdroji z ResourceDAO resourceDAO = getResourceDAO(); setResourceData((ResourceTO) resourceDAO.zatížení(employeeId)); // V případě potřeby načtěte další závislé objekty ... } chytit(Výjimka např) { házet Nový EJBException("Důvod:" + ...); } } veřejnost prázdnota ejbStore() { Snaž se { // Uložení informací o zdroji getResourceDAO().Aktualizace(getResourceData()); // Podle potřeby ukládejte závislé objekty ... } chytit(SkillSetException např) { házet Nový EJBException("Důvod:" + ...); } chytit(BlockOutTimeException např) { házet Nový EJBException("Důvod:" + ...); } ... } veřejnost prázdnota ejbPostCreate(ResourceTO zdroj) { } // Metoda získání objektu přenosu prostředků veřejnost ResourceTO getResourceTO() { // vytvořit nový objekt přenosu prostředků ResourceTO resourceTO = Nový ResourceTO(employeeId); // zkopírovat všechny hodnoty resourceTO.příjmení = příjmení; resourceTO.jméno = jméno; resourceTO.ID oddělení = ID oddělení; ... vrátit se resourceTO; } veřejnost prázdnota setResourceData(ResourceTO resourceTO) { // kopírování hodnot z objektu Transfer Object do entity bean employeeId = resourceTO.employeeId; příjmení = resourceTO.příjmení; ... } // Metoda získání závislých Přenosových objektů veřejnost Sbírka getSkillSetsData() { // Pokud není sada dovedností načtena, načtěte ji jako první. // Viz implementace strategie Lazy Load. vrátit se sady dovedností; } ... // další metody get a set podle potřeby ... // Entity bean business methods veřejnost prázdnota addBlockOutTimes(Sbírka moreBOT) hodí BlockOutTimeException { // Poznámka: moreBOTs je kolekce // Objekty BlockOutTimeTO Snaž se { Iterátor více = moreBOT.iterátor(); zatímco (více.hasNext()) { BlockOutTimeTO botTO = (BlockOutTimeTO) více.další(); -li (! (blockOutTimeExists(botTO))) { // přidat BlockOutTimeTO do kolekce botTO.nastavitNový(); blockOutTime.přidat(botTO); } jiný { // BlockOutTimeTO již existuje, nelze přidat házet Nový BlockOutTimeException(...); } } } chytit(Výjimka výjimka) { házet Nový EJBException(...); } } veřejnost prázdnota addSkillSet(Sbírka více Dovednosti) hodí SkillSetException { // podobné implementaci addBlockOutTime () ... } ... veřejnost prázdnota updateBlockOutTime(Sbírka updBOTy) hodí BlockOutTimeException { Snaž se { Iterátor Botter = blockOutTimes.iterátor(); Iterátor aktualizátor = updBOTy.iterátor(); zatímco (aktualizátor.hasNext()) { BlockOutTimeTO botTO = (BlockOutTimeTO) aktualizátor.další(); zatímco (BotIter.hasNext()) { BlockOutTimeTO existující BOT = (BlockOutTimeTO) Botter.další(); // porovnejte klíčové hodnoty a vyhledejte BlockOutTime -li (existující BOT.rovná se(botTO)) { // Nalezen BlockOutTime ve sbírce // nahradit starý BlockOutTimeTO novým botTO.set Dirty(); // upravené staré závislé botTO.resetNový(); // není nový závislý existující BOT = botTO; } } } } chytit (Výjimka výborně) { házet Nový EJBException(...); } } veřejnost prázdnota updateSkillSet(Sbírka updSkills) hodí CommitmentException { // podobně jako updateBlockOutTime ... ... } ...}