Как отобразить результат myBatis на несколько объектов? - PullRequest
2 голосов
/ 25 октября 2011

Возможно ли в myBatis 3 сопоставить один результат нескольким объектам, гарантируя, что все объекты ссылаются на один и тот же экземпляр? Есть ли пример, на который я мог бы сослаться?

Обновлено, чтобы добавить больше деталей:

Например, допустим, я храню информацию о Contact s для моего приложения в моей БД. Я хочу знать, возможно ли использовать myBatis для сопоставления того же экземпляра контакта, скажем, с классом Listing, который содержит Contact:

public class Listing {
    private Contact myContact;
    //getters & setters...
}

, а также класс ContactsHolder, который также содержит Contact:

public class ContactsHolder {
    private Contact aContact
    //getters & setters...
}

Мне нужен объект, который сопоставлен myBatis с классами Listing и ContactsHolder, чтобы они были одним и тем же экземпляром. Это возможно?

Ответы [ 2 ]

1 голос
/ 27 октября 2011

Нет, MyBatis не может сделать это со стандартным отображением результатов.(по крайней мере, насколько мне известно).Вы можете выбрать объект «Контакт», а затем вручную создать объект Listing и ContactsHolder, ссылаясь на оба контакта.

Или реализовать собственный ResultSetHandler.

Это своего рода особый запрос, яЯ не уверен, почему вы хотите, чтобы одни и те же экземпляры распределялись между двумя подобными объектами.Вероятно, поэтому в MyBatis 3 не существует такой функции, как эта.

0 голосов
/ 24 мая 2018

Это можно сделать с помощью стандартного сопоставления результатов, если вы используете select для выборки связанного контакта, и оба объекта извлекаются в одном сеансе.

Изменить карты результатов для Listing и ContactsHolder:

<resultMap type="Listing" id="listingMap">
   <association property="myContact" column="contact_id" javaType="Contact" select="selectContact"/>
</resultMap>

<resultMap type="ContactsHolder" id="contactsHolderMap">
   <association property="aContact" column="contact_id" javaType="Contact" select="selectContact"/>
</resultMap>

Теперь создайте запрос selectContact:

<select id='selectContact' resultType='Contact'>
     SELECT * from contact where id = #{id}
</select>

Теперь, если вы создадите какой-то выбор, который будет использовать listingMap и contactsHolderMap для сопоставления записей Listing и ContactsHolder, которые ссылаются на один и тот же контакт, они оба будут запрашивать контакт, используя один и тот же идентификатор.

Mybatis использует локальный кеш для всех объектов, считываемых в сеансе, поэтому во время извлечения второго связанного контакта ударится кеш, и тот же объект будет использован повторно.

Даже если вы сделаете два запроса вручную, чтобы получить Listing и ContactsHolder в одной и той же транзакции , одинаковые Contact будут использоваться в обоих возвращаемых объектах.

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