복합 도면요소 패턴
Composite entity pattern복합 엔티티는 Java EE 소프트웨어 설계 패턴으로, 개별 미세조립 엔티티 콩으로 표현하기 보다는 상호 연관된 영구 개체를 모델링, 표현 및 관리하는 데 사용되며, 복합 엔티티 콩은 개체의 그래프를 나타내기도 한다.[1]
구조
복합기업 패턴을 구현하기 위한 여러 가지 전략이 있다.이 패턴은 주로 복합체, 굵은 결의 객체 및 종속 객체를 합성한다.[1]
복합 엔티티 구성요소
복합 엔터티는 굵은 결이 있는 물체일 수도 있고 굵은 결이 있는 물체에 대한 참조를 포함할 수도 있는 굵은 결의 실체 콩이다.[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과 유사... ... } ... }