Это можно сделать с помощью стандартного сопоставления результатов, если вы используете 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
будут использоваться в обоих возвращаемых объектах.