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;
은}
"상황에 맞는"매핑을 어떻게 수행합니까? –