如何将myBatis结果映射到多个对象?

时间:2011-10-25 18:47:19

标签: orm mapping ibatis mybatis

在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映射到ListingContactsHolder类的对象才是同一个实例。这可能吗?

2 个答案:

答案 0 :(得分:1)

不,MyBatis无法使用标准结果映射执行此操作。 (至少据我所知)。您可以选择“Contact”对象,然后手动构建一个Listing和ContactsHolder,它们都引用了Contact。

或实现自定义ResultSetHandler。

这是一种特殊的请求,我不确定为什么你想要在这样的两个对象之间共享相同的实例。这可能就是MyBatis 3中没有这样的功能的原因。

答案 1 :(得分:0)

如果您使用select来获取关联的联系人,并且在同一会话中提取这两个对象,则可以使用标准结果映射来完成此操作。

修改ListingContactsHolder的结果地图:

<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>

现在,如果您创建一些同时使用listingMapcontactsHolderMap的select来映射引用同一联系人的ListingContactsHolder条记录,那么他们将使用{i}}来查询联系人同样的身份。

Mybatis对会话中读取的所有对象使用本地缓存,因此在获取第二个关联的联系人期间,缓存将被命中,同一对象将被重用。

即使您手动执行两个查询以在同一事务中获取ListingContactsHolder,也会在两个返回的对象中使用相同的Contact。< / p>