Как реализовать отношения один-ко-многим в Ibatis? - PullRequest
5 голосов
/ 04 февраля 2009

Допустим, у меня есть этот класс:


    Class A {
        int id;
        int[] b;
        // Other properties
    }

    Class B {
        int id;
        // Other properties
    }

Класс A имеет отношение один-ко-многим с классом B. У меня уже есть служба, которая кэширует объекты B и возвращает их по id.

Схема таблицы выглядит примерно так


    Table a:
    -------
      int id,
      prop1,
      etc

    Table a_to_b_map
    ----------------
      int a_id,
      int b_id

Теперь, как мне отобразить это в iBatis?

Поскольку объекты B уже кэшированы, я хочу получить список идентификаторов объектов A, а затем использовать сервис для обогащения As.

Может кто-нибудь подсказать, как это сделать?

Есть две возможные альтернативы:

  1. Создайте внутренний класс в A (карта AtoB) и используйте запрос select в конфигурации iBatis, чтобы заполнить это
  2. Внутри iBatis resultMap / select используйте другой выбор, чтобы получить список идентификаторов BID (не слишком уверенный в том, как это сделать в конфигурации)

Ответы [ 3 ]

2 голосов
/ 04 февраля 2009

Ну, я мог бы найти некоторую полезную информацию в документации для разработчиков iBatis 2 по адресу http://svn.apache.org/repos/asf/ibatis/trunk/java/ibatis-2/ibatis-2-docs/en/iBATIS-SqlMaps-2_en.pdf (в частности, страницы 36,37)

1 голос
/ 20 октября 2010

в mybatis 3 это немного по-другому. Вы можете сделать это, указав два оператора select, или вы можете использовать join, а затем создать resultMap с тегом collection.

<resultMap id=”blogResult” type=”Blog”>
   <collection property="posts" javaType=”ArrayList” column="blog_id"
      ofType="Post" select=”selectPostsForBlog”/>
</resultMap>

<select id=”selectBlog” parameterType=”int” resultMap=”blogResult”>
    SELECT * FROM BLOG WHERE ID = #{id}
    </select>
<select id=”selectPostsForBlog” parameterType=”int” resultType="Author">
    SELECT * FROM POST WHERE BLOG_ID = #{id}
    </select>

или вы можете использовать join

<select id="selectBlog" parameterType="int" resultMap="blogResult">
select
    B.id as blog_id,
    B.title as blog_title,
    B.author_id as blog_author_id,
    P.id as post_id,
    P.subject as post_subject,
    P.body as post_body,
from Blog B
    left outer join Post P on B.id = P.blog_id
where B.id = #{id}
</select>

и сделать карту результатов

<resultMap id="blogResult" type="Blog">
  <id property=”id” column="blog_id" />
  <result property="title" column="blog_title"/>
  <collection property="posts" ofType="Post">
    <id property="id" column="post_id"/>
    <result property="subject" column="post_subject"/>
    <result property="body" column="post_body"/>
  </collection>
</resultMap>

Вы можете получить полную версию руководства пользователя ibatis здесь:

http://svn.apache.org/repos/asf/ibatis/java/ibatis-3/trunk/doc/en/iBATIS-3-User-Guide.pdf

0 голосов
/ 04 февраля 2009

Не уверен, правильно ли я понял ваш вопрос.

Предполагая, что вы будете делать запросы на основе идентификатора А, как насчет того, чтобы написать запрос в ibatis, который объединяет две таблицы?

select * 
from a, a_to_b_map 
where a.id = #id# and a.id = a_to_b_map.a_id

Затем можно использовать queryForMap, чтобы вернуть хэш-карту a_id vs (коллекция записей из запроса). Используйте пользовательский метод для преобразования этой структуры данных в объект 'A'

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