복합 도면요소 패턴

Composite entity pattern

복합 엔티티Java EE 소프트웨어 설계 패턴으로, 개별 미세조립 엔티티 콩으로 표현하기 보다는 상호 연관된 영구 개체를 모델링, 표현 및 관리하는 데 사용되며, 복합 엔티티 콩은 개체의 그래프를 나타내기도 한다.[1]

구조

복합기업 패턴을 구현하기 위한 여러 가지 전략이 있다.이 패턴은 주로 복합체, 굵은 결의 객체 및 종속 객체를 합성한다.[1]

Composite entity pattern class diagram


복합 엔티티 구성요소

복합 엔터티는 굵은 결이 있는 물체일 수도 있고 굵은 결이 있는 물체에 대한 참조를 포함할 수도 있는 굵은 결의 실체 콩이다.[1]

굵은 결이 있는 물체

굵은 결이 있는 물체는 자신의 수명주기가 다른 물체와의 관계를 관리하는 물체다.복합 엔티티에 포함된 개체일 수도 있고, 복합 엔티티 자체도 종속 개체를 보유하는 거친 결속 객체일 수도 있다.[1]

종속 객체

그것은 굵은 결의 객체에 의존하고 있는 다른 종속 객체(복합 실체 내에 물체의 트리가 있을 수 있음)를 포함할 수 있는 물체로, 굵은 결의 객체에 의해 그 수명 주기를 관리한다.[1]

결과들

Oracle의 패턴에 대한 설명에 따르면, 결과에는 상호 관계 제거, 엔티티 콩 감소에 의한 관리성 향상, 네트워크 성능 향상, 데이터베이스 스키마 종속성 감소, 객체 세분성 증가, 복합 전송 객체 생성 촉진 및 다중 레벨 종속 객체의 오버헤드가 포함된다.그래프[1]

단점

치명적인 단점은 콩 관리 지속성(BMP) 의 요구 사항이다.여기에는 개발자를 위한 더 많은 작업이 포함되며 다음과 같은 몇 가지 문제가 발생한다.

  • 거친 결로체의 모든 데이터를 이용할 때마다 실현하는 것은 용납할 수 없을 정도로 비싸다.
  • 자바에서, ejbStore() 방법의 구현은 모든 영구 객체에서 데이터가 변경되지 않는 한, 객체의 전체 상태를 유지하는 데 필요한 모든 업데이트의 발행을 피할 수 있을 만큼 충분히 스마트해야 한다.

복합 엔터티 패턴은 BMP를 사용하거나 컨테이너 관리 지속성(CMP) 에 더 많은 손으로 코딩된 지속성 논리를 추가해야만 구현할 수 있다.이 두 가지 접근법은 유지보수를 감소시킨다.[2]

샘플코드

리소스 개체가 복합 엔터티 패턴을 통해 구현되는 PSA(Professional Service Automation Application)의 샘플 코드는 다음과 같을 수 있다(entity는 거친 결로 객체를 구현).

꾸러미 corepattern.psa.ejb;  수입하다 corepatterns.psa.core.*; 수입하다 corepattern.psa.dao.*; 수입하다 java.sql.*; 수입하다 자바스크.sql.*; 수입하다 java.util.*; 수입하다 자바스.ejb.*; 수입하다 자바스의*;  공중의 계급 ResourceEntity 기구들 엔티티빈 {     공중의  종업원아이디;     공중의  ;     공중의  이름;     공중의  부서아이드;     공중의  연습 그룹;     공중의  칭호를 붙이다;     공중의  등급을 매기다;     공중의  이메일을 보내다;     공중의  전화를 걸다;     공중의  세포를 놓다;     공중의  삐삐를 치다;     공중의  managerId;          // BlockOutTime 종속 객체 수집     공중의 컬렉션 블록아웃타임즈;      // SkillSet Dependent 객체 모음     공중의 컬렉션 스킬 세트;      ...      사유의 엔티티콘텍스트 문맥; // 엔티티 빈 방법 구현 공중의  ejbCreate(자원 자원) 던지다      CreateException {         해보다 {             .종업원아이디 = 자원.종업원아이디;             setResourceData(자원);             getResourceDAO().만들다(자원);         } 잡히다(예외 이외의) {             던지다 새로운 EJBException("이유:" + ...);         }         돌아오다 .종업원아이디; }      공중의  ejbFindByPrimaryKey( 기본 키)      던지다 FinderException {         부울 결과;         해보다 {             리소스DAO resourceDAO = getResourceDAO();             결과 =                  resourceDAO.기본 키별 선택(기본 키);         } 잡히다(예외 이외의) {             던지다 새로운 EJBException("이유:" + ...);         }         만일 (결과) {             돌아오다 기본 키;         }         다른 {             던지다 새로운 ObjectNotFoundException(...);         }     }          공중의 공허하게 하다 ejbRemove() {         해보다 {             // 종속 객체 제거             만일 (.스킬 세트 != 무효의) {                  스킬셋DAO 스킬세트DAO = 겟스킬세츠다오();                 스킬세트DAO.setResource아이디(종업원아이디);                 스킬세트DAO.deleteAll();                 스킬 세트 = 무효의;             }             만일 (.블록아웃 시간 != 무효의) {                 블록아웃 시간DAO 차단 시간DAO =                          getBlockOutTimeDAO();                 차단 시간DAO.setResource아이디(종업원아이디);                 차단 시간DAO.deleteAll();                 블록아웃타임 = 무효의;             }              // 영구 저장소에서 리소스 제거             리소스DAO resourceDAO = 새로운                  리소스DAO(종업원아이디);             resourceDAO.삭제하다();         } 잡히다(리소스Exception 이외의) {             던지다 새로운 EJBException("이유:"+...);         } 잡히다(블록아웃 시간예외 이외의) {             던지다 새로운 EJBException("이유:"+...);         } 잡히다(예외 예외적인) {             ...         }     }     공중의 공허하게 하다 setEntityContext(엔티티콘텍스트 문맥)      {         .문맥 = 문맥;     }          공중의 공허하게 하다 unsetEntityContext() {         문맥 = 무효의;     }          공중의 공허하게 하다 ejb활성화() {         종업원아이디 = ()문맥.getPrimaryKey();     }          공중의 공허하게 하다 ejbPassivate() {         종업원아이디 = 무효의;     }          공중의 공허하게 하다 ejb 부하() {         해보다 {             // 리소스 정보 로드 위치             리소스DAO resourceDAO = getResourceDAO();             setResourceData((자원)                  resourceDAO.짐을 싣다(종업원아이디));                          // 필요한 경우 다른 종속 객체 로드             ...         } 잡히다(예외 이외의) {             던지다 새로운 EJBException("이유:" + ...);         }     }          공중의 공허하게 하다 ejb스토어() {         해보다 {             // 리소스 정보 저장             getResourceDAO().갱신하다(getResourceData());              // 필요에 따라 종속 개체 저장             ...         } 잡히다(스킬세트예외 이외의) {             던지다 새로운 EJBException("이유:" + ...);         } 잡히다(블록아웃 시간예외 이외의) {             던지다 새로운 EJBException("이유:" + ...);         }         ...     }     공중의 공허하게 하다 ejbPostCreate(자원 자원) {     }      // 리소스 전송 개체를 가져오는 방법     공중의 자원 getResource() {         // 새 리소스 전송 개체 생성         자원 자원 = 새로운                  자원(종업원아이디);          // 모든 값 복사         자원. = ;         자원.이름 = 이름;         자원.부서아이드 = 부서아이드;         ...         돌아오다 자원;     }      공중의 공허하게 하다 setResourceData(자원 자원) {         // Transfer Object에서 엔티티 빈으로 값을 복사         종업원아이디 = 자원.종업원아이디;          = 자원.;         ...     }      // 종속 전송 개체를 가져오는 방법     공중의 컬렉션 getSkillSetsData() {         // 스킬 세트가 로드되지 않은 경우 먼저 로드하십시오.         // 게으른 부하 전략 구현을 참조하십시오.          돌아오다 스킬 세트;         }     ...      // 기타 필요에 따라 방법 가져오기 및 설정     ...      // 엔티티 콩 사업법     공중의 공허하게 하다 추가BlockOutTimes(컬렉션 모어봇)      던지다 블록아웃 시간예외 {         // 참고: moreBOTs는 의 집합이다.         // BlockOutTimeTO 객체         해보다 {             반복기 모리에이터 = 모어봇.반복기();             하는 동안에 (모리에이터.hasNext()) {                 블록아웃 시간 보토 = (블록아웃 시간)                                                      모리에이터.다음에();                 만일 (! (블록아웃 시간존재한다(보토))) {                     // BlockOutTime 추가To to Collection                     보토.setNew();                     블록아웃 시간.덧셈을(보토);                 } 다른 {                     // BlockOutTimeTO가 이미 있으므로 추가할 수 없음                     던지다 새로운 블록아웃 시간예외(...);                 }             }         } 잡히다(예외 예외적인) {             던지다 새로운 EJBException(...);         }     }      공중의 공허하게 하다 addSkillSet(컬렉션 모어 스킬스)      던지다 스킬세트예외 {         // addBlockOutTime() 구현과 유사         ...     }      ...      공중의 공허하게 하다 updateBlockOutTime(컬렉션 UPDBOTs)      던지다 블록아웃 시간예외 {         해보다 {             반복기 보티터 = 블록아웃타임.반복기();             반복기 업데이터 = UPDBOTs.반복기();             하는 동안에 (업데이터.hasNext()) {                 블록아웃 시간 보토 = (블록아웃 시간)                     업데이터.다음에();                 하는 동안에 (보티터.hasNext()) {                     블록아웃 시간 기존BOT =                          (블록아웃 시간) 보티터.다음에();                     // 주요 값을 비교하여 BlockOutTime을 찾음                     만일 (기존BOT.대등하다(보토)) {                         // 수집에서 BlockOutTime 발견                         // 이전 BlockOutTime 교체TO with new one                         보토.셋더티(); //기존 종속자                         보토.리셋새(); //새로운 부양가족이 아님                         기존BOT = 보토;                     }                 }             }         } 잡히다 (예외 흥분시키다) {             던지다 새로운 EJBException(...);         }     }      공중의 공허하게 하다 updateSkillSet(컬렉션 업스킬스)      던지다 헌신예외 {         // updateBlockOutTime과 유사...         ...     }      ...  } 

[1]

참고 항목

참조

  1. ^ a b c d e f g "Core J2EE Patterns - Composite Entity". Oracle. Oracle. Retrieved 6 February 2016.
  2. ^ Johnson, R. (2003). Expert One-on-One J2EE Design and Development. Indianapolis: Wiley Publishing, Inc. p. 290.