Ибатис наследство и один ко многим - PullRequest
1 голос
/ 28 мая 2009

Добрый день

У меня есть сложная модель (DDD), которую я хочу отобразить с помощью ibatis.

Моя модель выглядит следующим образом:

class A {
 int id;
 String title;
 List <B> b;
}

abstract class B {
 int id;
 String title;
 List <C> f;
 int type;
}

class BA extends B {

 BA() {
  setType(1);
 }
}

class BB extends B {

  BB {
   setType(2);
  }
}

Мое текущее сопоставление XML:

<sqlMap namespace="ABC">

  <resultMap id="aResult" class="A" groupBy="a_id">
    <result property="id" column=""a_id" />
    <result property="title" column="a_title" />
    <result property="b" resultMap="ABC.bResult" />
</resultMap> 

<resultMap id="bResult" class="java.util.HashMap">       
   <discriminator javaType="java.lang.Integer" column="b_type">
      <subMap value="1" resultMap="baResult" />
      <subMap value="2" resultMap="bbResult" />
   </discriminator>
</resultMap>

<resultMap id="baResult" class="BA">
  <result property="id" column="b_id" />
  <result property="title" column="b_title" />
</resultMap>

<resultMap id="bbResult" class="BB">
  <result property="id" column="b_id" />
  <result property="title" column="b_title" />
</resultMap>

<select id="aselect" resultMap="aResult">
select a.id as 'a_id', a.title as 'a_title', b.id as 'b_id', b.title as 'b_title', b.type as 'b_type'
from aa a left join bb b on a.id = b.aid
</select>

Таблица

aa (
id int not null primary key,
title varchar(50) not null
)

bb (
id int not null primary key,
aid int not null,
title varchar(50) not null
type int not null
)

Наследование работает, но оно возвращает только одно в событии A (ether BA или BB), хотя b является списком и для b (BA, BB) имеется несколько строк Не могли бы вы помочь мне?

Причиной использования классов BA и BB является то, что они содержат отдельную логику бизнеса (согласно DDD).

Я использую ibatis 2.3.4.726 для Java

Ответы [ 2 ]

2 голосов
/ 12 июня 2009

Я думаю, что нашел проблему, отображение неверное. Когда он попробовал это:

<resultMap id="aResult" class="A" groupBy="id">

Это сработало.

0 голосов
/ 01 июня 2009

Йохан, я не думаю, что достаточно информации, чтобы продолжить.

Что именно вы получаете, когда запускаете SQL-запрос вручную, вы получаете несколько строк результатов? Может быть, вы действительно получаете только одну строку результатов, которая будет отображаться в одну A, содержащую List с либо BA, либо BB в нем.

Можете ли вы показать нам код Java, который вы используете для вызова iBatis с этим запросом? Если вы скажете queryForObject (), вы получите только один верхний уровень A, а queryForList () выдаст вам List . Это не похоже на вашу проблему, но, возможно, это частичный ответ.

Есть ошибки в вашем SQL (пропущенная запятая) и в вашей карте SQL (двойные двойные кавычки), но я предполагаю, что это опечатки.

Ваши результирующие объекты Java, я считаю, должны быть JavaBeans и, следовательно, должны иметь методы get / set, которые вы не показываете выше. Но если бы это была проблема, я бы ожидал, что вы не получите никаких данных обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...