2014-09-18 2 views
0

WS 용 CXF, DI 용 스프링, 지속성을위한 Hibernate, 현재 DO-DTO 매핑 용 Orika를 제공하는 웹 프로젝트가 있습니다. 이 두 엔티티는 다음과 같습니다.DTO 전략에 대한 모델

@Entity 
public class Course { 

    @Id 
    private Long courseId; 

    @Column 
    private String name; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "scheduleId") 
    private Schedule schedule; 
    ... 
} 

@Entity 
public class Schedule { 

    @Id 
    private Long scheduleId; 

    @Column 
    private String name; 

    @OneToMany(mappedBy="schedule") 
    private List<Course> courses; 
    ... 
} 

DTO 개체를 만들 때 올바른 접근 방식에 관한 질문입니다. 보시다시피 객체에 대한 양방향 관계가 있으므로 1 : 1 DTO를 만들면 CXF가 WebService 용 XML로 마샬링하려고 할 때 순환 참조가 발생합니다.

내가 지금까지 한 일이다 : 당신은 내가 목록이 포함되어 다음 ScheduleWithCoursesDTO "특별한"는 ScheduleDTO 기본적인 특성 (아무 관계)가 객체와이 볼 수 있듯이

@Service("scheduleService") 
public class ScheduleService extends AbstractService implements IScheduleService{ 

@Autowired 
private IScheduleDAO scheduleDAO; 

public List<ScheduleDTO> getSchedules() { 
     List<ScheduleDTO> schedulesDTO = new ArrayList<ScheduleDTO>(); 
     List<Schedule> schedules = scheduleDAO.findAll(); 
     for(Schedulep:schedules) { 
      schedulesDTO.add(this.map(p, ScheduleDTO.class)); 
     } 
     return schedulesDTO; 
    } 

    @Override 
    @Transactional(readOnly=true) 
    public ScheduleDTO getSchedule(Long id) { 
     Schedule schedule = scheduleDAO.findById(id); 
     ScheduleDTO scheduleDTO = new ScheduleDTO(); 
     this.map(schedule, scheduleDTO); 
     return scheduleDTO; 
    } 

    @Override 
    @Transactional(readOnly=true) 
    public ScheduleWithCoursesDTO getScheduleWithCourses(Long id) { 
     //loads schedule object and join fetchs all associated courses 
     Schedule schedule = scheduleDAO.findWithCourses(id); 
     ScheduleWithCoursesDTO sch = this.map(schedule, ScheduleWithCoursesDTO.class); 
     return sch; 
    } 
} 

CourseDTO 클래스의 기본 특성 만 포함합니다. 이 방법은 나에게 어색함을 느낀다. Schedule으로 모든 강좌를 검색하고 관련 강좌와 함께 강좌를 검색해야하는 사례를 생각해 볼 수 있습니다. 필요한 모든 관계의 조합에 대해 이러한 "특수 DTO"개체를 만드는 것이 일반적인 절차입니까? 제가 누락 된 다른 방법이 있습니까? 오리 카 (Orka) 나 다른 매퍼 (Mapper)에게 특정 매핑 실행에 대한 특정 속성을 무시하도록 지시하는 방법이있을 수 있습니다 (전역 적으로 구성하는 것과 반대).

ScheduleDTO :

public class ScheduleDTO { 

    private Long scheduleId; 

    private String name; 

} 

ScheduleWithCoursesDTO

public class ScheduleWithCoursesDTO extends ScheduleDTO { 

    private List<CourseDTO> courses; 

은}

답변

1

예, 방법이 어떤 사람들이 "상황"매핑을 가지고 사랑 해요. 개인적으로 나는 이것을 좋아하지 않으며 각 유스 케이스에 대해 적절한 DTO를 선호한다. DTO는 작동/서비스에 관련된 데이터에 대한 계약 및/또는 문서화 방법이라고 생각한다.

Orika의 매핑 코드는 여전히 Java 코드이며 다시 사용할 수 있으므로 "비즈니스"코드와 마찬가지로 구성 할 수 있습니다. 새로운 DTO를 만드는 것은 우리가 필요로하는만큼 큰 문제는 아니지만 문제는 아닙니다. 원하는대로 NewScheduleDTO BasicInfoScheduleDTO FullDetailsScheduleDTO 할 수 있습니다.

문맥 매핑/조건부가 필요한 심각한 사용 사례가있는 경우 Orika Filter API를 사용하거나 각 상황에 대해 여러 MapperFactory를 관리 할 수 ​​있습니다.

+0

"상황에 맞는"매핑을 어떻게 수행합니까? –