2012-04-03 4 views
1

저는 혼자 해결할 수없는 문제에 직면했습니다. 따라서 저는 당신의 도움을 요청하고 있습니다. 문제는 다음과 같습니다. 지속성 계층을 업그레이드해야합니다. 이전에는 JDBC를 사용하여 데이터에 액세스했지만 지금은 JPA를 사용해야합니다. 이제 데이터가 새로운 객체에서 검색되지만 시스템은 이전 객체와 함께 작동합니다. 따라서 이전 엔티티와 새 엔티티 사이에 변환기를 작성해야합니다. 그러나 문제는 때로는 기존 엔티티에서 새로운 엔티티를 형성하는 것입니다. 우리는 몇 가지 추가 정보가 필요합니다. 예를 들면 :오브젝트 변환기를 제작하는 모범 사례

class OldEntity{ 
    private int id; 
    // old entity contains only foreign key 
    private int otherEntityId; 
    ... 
} 

class NewEntity{ 
    private int id; 
    // new entity contains object that associated with foreign key 
    private OtherEntity otherEntity; 
    ... 
} 

우리는 모든 컨버터에 몇 가지 일반적인 인터페이스를 추가 할 수 있지만, 우리는 새로운 하나 된 개체로 변환하면, 첫째, 우리는 그 ID로 "otherEntity"를 검색하고 변환기를 제공해야합니다. 구조가 다른 엔티티가 많으므로 변환기의 메소드는 다양한 수의 다양한 매개 변수를 받아야 새로운 엔티티를 형성합니다. 질문 :이 문제에 대한 훌륭한 아키텍처 솔루션이 있습니까?

+0

추가 정보는 어떻게 얻을 수 있습니까? 사용자에게 대화 상자를 표시 하시겠습니까? –

+0

아니요. 외부 키 값으로 데이터베이스에서 검색됩니다. 예제의 클래스에서와 같이 : 우리는 이전 엔티티에 외래 키 값만을 가지고 있으며 새로운 엔티티 ID로 검색된 전체 객체를 채우기를 원합니다. 변환기 메서드 내에서 검색하는 것은 좋지 않은 생각입니다. 따라서 검색된 개체에 적절한 변환기 메서드를 제공하는 더 나은 방법을 찾고 있습니다. –

+0

맵핑을 구성하여 이전 엔티티를 생성하고 변환기가 필요하지 않은 방법이 있습니까? –

답변

1

Adapter Pattern의 경우처럼 보입니다. 응용 프로그램에는 OldEntities가 필요하지만 NewEntities에서는 지속성을 관리하므로 OldEntities와 NewEntities 간의 변환을 관리하는 어댑터가 필요합니다.

그런 다음 도메인 모델의 모든 항목에 대해 어댑터를 만들어야합니다. 그들은 다음과 같아야합니다 :

class NewEntityAdapter extends OldEntity{ 
    private NewEntity newEntity; 

    //This is an overriden method 
    public int getOtherEntityId(){ 
     return newEntity.getOtherEntity().getId(); 

} 
+0

예. 그것은 좋은 해결책이지만 다른 방향으로 변환하려고 할 때 문제가 발생합니다. 내부에 적은 양의 정보를 저장하므로 오래된 엔티티를 새로운 엔티티로 쉽게 가져올 수 있습니다. 그러나 오래된 엔터티에서 새로운 엔터티를 형성하려면 추가 정보를 검색하고 변환하는 메서드에 제공해야합니다. 어댑터 내부에서 검색하는 것은 좋지 않다고 생각합니다. –

+0

서비스 계층을 사용합니까? 서비스 레이어는 Old Entities에 포함 된 ID 정보를 기반으로 NewEntity 인스턴스를 얻기 위해 DAO 레이어에 요청하는 좋은 장소입니다. 트랜잭션 지원으로 인해 그러한 작업을 수행 할 수있는 최상의 장소라고 생각합니다. –

+0

예. 모든 대화는 서비스 계층에서 수행되어야하며 모든 요구 사항 데이터를 검색 할 수 있습니다. 하지만 다른 엔터티가 어댑터의 생성자 또는 변환기 메서드에 부여해야하는 추가 매개 변수의 수가 서로 다르기 때문에 다소 복잡해 보입니다. 어댑터를 사용한 접근 방식이 좋지 않습니다. 추가 클래스가 많이 생성되기 때문입니다. 내 생각은 몇 가지 일반적인 인터페이스를 가진 변환기를 만드는 것이 었습니다. 여기서 문제는 컨버터의 메서드에 매개 변수를 지정하는 방법입니다. 좋지 않지만 유용한 접근법 중 하나는 추가 매개 변수에 대해 Map을 사용하는 것입니다. –

1

시도해 볼 수 있습니다.

public interface IBaseEntity{ 

    public int getId(); 

} 

public class OldEntity implements IBaseEntity{ 
    public int getId(){ 
     return id; 
    } 
} 

public class NewEntity{ 
    IBaseEntity entity; 
    public NewEntity(IBaseEntity entity){ 
     this.entity=entity; 
    } 
    public int getId(){ 
     return entity.getId(); 
    } 
} 
+0

감사! 가능한 솔루션입니다. 그러나 엔티티 클래스 외부로 변환 논리를 이동하려면 변환기가 실제로 필요합니다. –