2014-02-05 3 views
0

PlanActivity이라는 목록이있는 클래스가 있습니다. Activity 클래스에는 Plan이라는 단일 참조가 있습니다.JPA OneToMany 관계를 DTO로 변환

@Entity 
public class Plan { 

    @OneToMany(mappedBy = "Plan") 
    private List<Activity> activities; 
} 

@Entity 
public class Activity { 

    @ManyToOne 
    @JoinColumn(name= "PLAN_ID") 
    private Plan plan; 
} 

내가 프리젠 테이션 레이어로 전송하는 DTO들로 변환해야합니다 따라서이 같은 OneToMany 관계가있다. 그래서 간단하게 도메인 객체를 POJO로 변환하는 어셈블러 클래스가 있습니다. 당신이 볼 수 있듯이

public class PlanAssembler { 

    public static PlanDTO makeDTO(Plan p) { 

    PlanDTO result = new PlanDTO(); 
    result.setProperty(p.getProperty); 
    ... 

    for (Activity a: p.getActivity()) { 

    // Here I need to iterate over each activity to convert it to DTO 
    // But in ActivityAssembler, I also need PlanDTO 

    } 

PlanAssembler에, 나는 모든 활동을 반복하고 ActivityDTO로 변환 할 필요가 있지만, 문제는,이다 ActivityAssembler에 나는 또한 ActivityDTO를 구성하는 PlanDTO이 필요합니다. 무한 루프이 될 것입니다. 이것을 어떻게 분류 할 수 있습니까?

도와주세요.

+0

당신이 당신의 POJO의 DTO들로 변환하는 도저와 같은 도구를 사용하여 생각 해 봤나? 그들은 이런 종류의 역 참조를 사용하는 논리를 가지고 있습니다 : http://dozer.sourceforge.net/documentation/faq.html#infinite-loop – Esquive

답변

1

방금 ​​루프 전에 만든 PlanDTO 개체 결과를 사용해야하므로 무한 루프가되지 않습니다. 아래 코드를 참조하십시오.

참고 : 아직도이 자료를 제공 할 프레임 워크를 제안합니다.

public class PlanAssembler { 

    public static PlanDTO makeDTO(Plan p) { 

    PlanDTO result = new PlanDTO(); 
    result.setProperty(p.getProperty); 
    ... 

    for (Activity a: p.getActivity()) { 

     ActivityDTO activityDTO = new ActivityDTO(); 
    // Here I need to iterate over each activity to convert it to DTO 
    // But in ActivityAssembler, I also need PlanDTO 

    //Code to convert Activity to ActivityDTO. 

     activityDTO.setPlan(result); 
    } 
+0

고마워요. 그러나 여기에있는'잘못된'계획은'PlanDTO'이고'활동'은'계획'만 가질 수 있습니다. 'PlanDTO'가 아니다. –

+0

필자는 대답에서 코드를 업데이트했습니다. 실제로 Activity도 DTO로 변환되어야하고 DTO는 PlanDTO를 가리켜 야합니다. –

+0

한 가지는 'Activity'를 위해 특별히 다른 어셈블러가 있습니다. 그것은 ActivityAssembler라고 불립니다. 방금 작성한'PlanDTO'를'ActivityAssembler'에 매개 변수로 보내서 거기에 설정하는 것이 더 낳습니까? –

2

이제 정말 직접 것들을 분류하려면 :

1) 매퍼 클래스에서는 그들을 단방향 함으로써이 문제 해결 매퍼 구현 정의 수. MapPlanWithActivities(), MapPlan(), MapActivitiesWithPlan()MapActivities()과 같은 방법을 사용하십시오. 이 방법을 사용하면 필요한 데이터와 사용하는 함수에 따라 재귀를 멈출시기를 알 수 있습니다.

2) 더 복잡한 솔루션은 논리로 문제를 해결하고 루프를 감지하는 것입니다. 예를 들어, Jackson Library처럼 해당 사례에 대한 주석을 정의 할 수 있습니다. 그 때문에 당신은 자바 리플렉션을 사용해야 할 것입니다. See Java Reflection here

3) 가장 쉬운 방법은 내 의견에 말했듯이 도저를 사용하는 것입니다 : Dozer