2013-11-16 3 views
0

Я стараюсь использовать те же методы, что и в этом блоге here, чтобы избежать проблемы с N + 1. я создал 5 классов с многими до 1 отношения следующим образом:вложенные коллекции с POJO

Ствол -> Branch 1 -> Branch 2 -> Branch 3 -> Лист

Я пытаюсь построить мой XML-картографа, который соответствует, но сбой во время выполнения с ошибкой, что нет никакой собственности «branch2» в «класса com.mytest.branch1»

Я определил мой XML Mapper, как

<mapper namespace="com.mytest.test"> 
    <resultMap id="resultTest" type="com.mytest.test.trunk"> 
    <id property="TrunkID" column="TRUNK_ID" /> 
    <collection property="Branch1" column="BRANCH_1_ID" javaType="ArrayList" ofType="com.mytest.test.branch1"> 
     <id property="branch1ID" column="BRANCH_1_ID"> 
     <collection property="Branch2" column="BRANCH_2" javaType="ArrayList" ofType="com.mytest.test.branch2"> 
     <id property="branch2ID" column="BRANCH_2_ID"> 
     <collection property="Branch3" column="BRANCH_3" javaType="ArrayList" ofType="com.mytest.test.branch3"> 
      <id property="branch3ID" column="BRANCH_3_ID"> 
      <result property="Value" column="Value"> 
     </collection> 
     </collection> 
    </collection> 
    </resultMap> 
    <select id="getAllNodes" resultMap="resultTest"> 
    select n.TRUNK_ID,b.BRANCH_1_ID,b.BRANCH_2_ID,b.BRANCH_3_ID,b.VALUE FROM node n join branches b on n.node_id=b.node_id 
    </select> 
</mapper> 

класса ствол:

public class Trunk { 

private int TrunkID; 
private List<Branch1> Branch1; 


//getters and setters 
} 

Класс branch1:

public class Branch1{ 

private int Branch1ID; 
private List<Branch2> Branch2; 

//getters and setters ... 
} 

Класс branch2:

public class Branch2{ 

private int Branch2ID; 
private List<Branch3> Branch3; 

//getters and setters ... 
} 

Класс Branch3:

public class Branch3{ 

private int Branch3ID; 

//getters and setters ... 
} 
+0

, пожалуйста, покажите нам разделы 'branch1',' branch2', 'branch3'. –

+0

@ MichałRybak добавлен к вопросу. – mrkb80

ответ

0

Есть две вещи здесь.


Первый, вы даже попытаться составить код?
BranchX классы (и Trunk тоже) не имеют имен для List полей. Он должен выглядеть следующим образом:

public class Trunk { 
    private int TrunkID; 
    private List<Branch1> listOfBranches; // name added 
} 

Так пожалуйста исправить Trunk, Branch1 и Branch2 следовать abouve примеру.


Вторая вещь что гнездовые <collection> s не работает таким образом.
Обратитесь к the docs. Они говорят:

property: поле или свойство для отображения результата колонок. Если для данного имени существует соответствующее свойство JavaBeans, оно будет использоваться. В противном случае MyBatis будет искать поле с заданным именем.

Так что, если вы пишете

<collection property="Branch1" column="BRANCH_1_ID" javaType="ArrayList" ofType="com.mytest.test.branch1"> 
    <id property="branch1ID" column="BRANCH_1_ID"> 
    <collection property="Branch2" column="BRANCH_2" javaType="ArrayList" ofType="com.mytest.test.branch2"> 
    ... 
    </collection> 
</collection> 

внешний <collection> элемент ArrayList из Branch1.
Она имеет два внутренних элементов:

  • <id> который корректно отображается в branch1ID поле в Branch1 класса
  • <collection> который должен быть отображен в поле Branch2 в Branch1 классе - который не существует.

Предложенное исправить это назвать все List поля в классах адекватно, то есть:

public class Trunk { 
    private int TrunkID; 
    private List<Branch1> branch1; 
} 

public class Branch1{ 
    private int Branch1ID; 
    private List<Branch2> branch2; 
} 

т.д.

Надежда, что помогает понять, в чем проблема.

+0

Извините, я немного запутываю свой код ... Я исправлю вопрос. – mrkb80

+0

Спасибо за помощь! – mrkb80

Смежные вопросы