Jump to content

Шаблон составной сущности

Составная сущность — это Java EE шаблон проектирования программного обеспечения , который используется для моделирования, представления и управления набором взаимосвязанных постоянных объектов, а не представляет их как отдельные мелкозернистые объектные компоненты, а также составной объектный компонент представляет собой граф объектов. [1]

Структура

[ редактировать ]

Существует ряд стратегий реализации шаблона составной сущности. Этот шаблон в основном состоит из составной сущности, крупнозернистого объекта и зависимых объектов. [1]

Диаграмма классов шаблонов составных сущностей
Composite entity pattern class diagram


Компонент составной сущности

[ редактировать ]

Составной объект — это объектный компонент общего назначения, который может быть объектом общего назначения или может содержать ссылку на объект общего назначения. [1]

Крупнозернистый объект

[ редактировать ]

Грубоструктурный объект — это объект с собственным жизненным циклом, который управляет собственными отношениями с другими объектами. Это может быть объект, содержащийся в составной сущности, или сама составная сущность может быть объектом общего назначения, содержащим зависимые объекты. [1]

Зависимые объекты

[ редактировать ]

Это объект, который может содержать другие зависимые объекты (в составной сущности может быть дерево объектов), который зависит от объекта общего назначения и жизненный цикл которого управляется объектом общего назначения. [1]

Последствия

[ редактировать ]

Согласно описанию шаблона Oracle, последствия включают устранение связей между сущностями, улучшение управляемости за счет сокращения объектных компонентов, повышение производительности сети, уменьшение зависимости от схемы базы данных, увеличение детализации объектов, облегчение создания составных объектов передачи и накладные расходы на многоуровневые зависимые графы объектов. . [1]

Недостатки

[ редактировать ]

Фатальным недостатком является требование наличия постоянного компонента, управляемого компонентом (BMP) . Это требует дополнительной работы для разработчиков и создает следующие проблемы:

  • материализация всех данных в крупнозернистом объекте при каждом доступе к ним неприемлемо дорога.
  • В Java реализация метода ejbStore() должна быть достаточно продуманной, чтобы избежать выдачи всех обновлений, необходимых для сохранения всего состояния объекта, если только данные не изменились во всех постоянных объектах.

Шаблон составной сущности можно реализовать только с помощью BMP или путем добавления дополнительной логики персистентности, закодированной вручную, в bean-компоненты персистентности, управляемой контейнером (CMP) . Оба эти подхода снижают ремонтопригодность. [2]

Пример кода

[ редактировать ]

Пример кода для приложения Professional Service Automation (PSA), в котором объект ресурса реализован с помощью шаблона составной сущности, может выглядеть следующим образом (сущность реализует объект общего назначения):

package 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.*;

public class ResourceEntity implements EntityBean {
    public String employeeId;
    public String lastName;
    public String firstName;
    public String departmentId;
    public String practiceGroup;
    public String title;
    public String grade;
    public String email;
    public String phone;
    public String cell;
    public String pager;
    public String managerId;
    
    // Collection of BlockOutTime Dependent objects
    public Collection blockoutTimes;

    // Collection of SkillSet Dependent objects
    public Collection skillSets;

    ...

    private EntityContext context;
// Entity Bean methods implementation
public String ejbCreate(ResourceTO resource) throws 
    CreateException {
        try {
            this.employeeId = resource.employeeId;
            setResourceData(resource);
            getResourceDAO().create(resource);
        } catch(Exception ex) {
            throw new EJBException("Reason:" + ...);
        }
        return this.employeeId;
}
    
public String ejbFindByPrimaryKey(String primaryKey) 
    throws FinderException {
        boolean result;
        try {
            ResourceDAO resourceDAO = getResourceDAO();
            result = 
                resourceDAO.selectByPrimaryKey(primaryKey);
        } catch(Exception ex) {
            throw new EJBException("Reason:" + ...);
        }
        if (result) {
            return primaryKey;
        }
        else {
            throw new ObjectNotFoundException(...);
        }
    }
    
    public void ejbRemove() {
        try {
            // Remove dependent objects
            if (this.skillSets != null) {

                SkillSetDAO skillSetDAO = getSkillSetDAO();
                skillSetDAO.setResourceID(employeeId);
                skillSetDAO.deleteAll();
                skillSets = null;
            }
            if (this.blockoutTime != null) {
                BlockOutTimeDAO blockouttimeDAO = 
                        getBlockOutTimeDAO();
                blockouttimeDAO.setResourceID(employeeId);
                blockouttimeDAO.deleteAll();
                blockOutTimes = null;
            }

            // Remove the resource from the persistent store
            ResourceDAO resourceDAO = new 
                ResourceDAO(employeeId);
            resourceDAO.delete();
        } catch(ResourceException ex) {
            throw new EJBException("Reason:"+...);
        } catch(BlockOutTimeException ex) {
            throw new EJBException("Reason:"+...);
        } catch(Exception exception) {
            ...
        }
    }
    public void setEntityContext(EntityContext context) 
    {
        this.context = context;
    }
    
    public void unsetEntityContext() {
        context = null;
    }
    
    public void ejbActivate() {
        employeeId = (String)context.getPrimaryKey();
    }
    
    public void ejbPassivate() {
        employeeId = null;
    }
    
    public void ejbLoad() {
        try {
            // load the resource info from
            ResourceDAO resourceDAO = getResourceDAO();
            setResourceData((ResourceTO) 
                resourceDAO.load(employeeId));
            
            // Load other dependent objects, if necessary
            ...
        } catch(Exception ex) {
            throw new EJBException("Reason:" + ...);
        }
    }
    
    public void ejbStore() {
        try {
            // Store resource information
            getResourceDAO().update(getResourceData());

            // Store dependent objects as needed
            ...
        } catch(SkillSetException ex) {
            throw new EJBException("Reason:" + ...);
        } catch(BlockOutTimeException ex) {
            throw new EJBException("Reason:" + ...);
        }
        ...
    }
    public void ejbPostCreate(ResourceTO resource) {
    }

    // Method to Get Resource Transfer Object
    public ResourceTO getResourceTO() {
        // create a new Resource Transfer Object
        ResourceTO resourceTO = new 
                ResourceTO(employeeId);

        // copy all values 
        resourceTO.lastName = lastName;
        resourceTO.firstName = firstName;
        resourceTO.departmentId = departmentId;
        ...
        return resourceTO;
    }

    public void setResourceData(ResourceTO resourceTO) {
        // copy values from Transfer Object into entity bean
        employeeId = resourceTO.employeeId;
        lastName = resourceTO.lastName;
        ...
    }

    // Method to get dependent Transfer Objects
    public Collection getSkillSetsData() {
        // If skillSets is not loaded, load it first.
        // See Lazy Load strategy implementation.

        return skillSets;    
    }
    ...

    // other get and set methods as needed
    ...

    // Entity bean business methods
    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.next();
                if (! (blockOutTimeExists(botTO))) {
                    // add BlockOutTimeTO to collection
                    botTO.setNew();
                    blockOutTime.add(botTO);
                } else {
                    // BlockOutTimeTO already exists, cannot add
                    throw new BlockOutTimeException(...);
                }
            }
        } catch(Exception exception) {
            throw new EJBException(...);
        }
    }

    public void addSkillSet(Collection moreSkills) 
    throws SkillSetException {
        // similar to addBlockOutTime() implementation
        ...
    }

    ...

    public void updateBlockOutTime(Collection updBOTs) 
    throws BlockOutTimeException {
        try {
            Iterator botIter = blockOutTimes.iterator();
            Iterator updIter = updBOTs.iterator();
            while (updIter.hasNext()) {
                BlockOutTimeTO botTO = (BlockOutTimeTO)
                    updIter.next();
                while (botIter.hasNext()) {
                    BlockOutTimeTO existingBOT = 
                        (BlockOutTimeTO) botIter.next();
                    // compare key values to locate BlockOutTime
                    if (existingBOT.equals(botTO)) {
                        // Found BlockOutTime in collection
                        // replace old BlockOutTimeTO with new one
                        botTO.setDirty(); //modified old dependent
                        botTO.resetNew(); //not a new dependent
                        existingBOT = botTO;
                    }
                }
            }
        } catch (Exception exc) {
            throw new EJBException(...);
        }
    }

    public void updateSkillSet(Collection updSkills) 
    throws CommitmentException {
        // similar to updateBlockOutTime...
        ...
    }

    ...

}

[1]

См. также

[ редактировать ]
  1. ^ Jump up to: а б с д и ж г «Основные шаблоны J2EE — составная сущность» . Оракул . Оракул . Проверено 6 февраля 2016 г.
  2. ^ Джонсон, Р. (2003). Экспертное индивидуальное проектирование и разработка J2EE . Индианаполис: Wiley Publishing, Inc., с. 290.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: d552e67a6a297201de1381c027dece04__1608138840
URL1:https://arc.ask3.ru/arc/aa/d5/04/d552e67a6a297201de1381c027dece04.html
Заголовок, (Title) документа по адресу, URL1:
Composite entity pattern - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)