在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
类的对象才是同一个实例。这可能吗?
答案 0 :(得分:1)
不,MyBatis无法使用标准结果映射执行此操作。 (至少据我所知)。您可以选择“Contact”对象,然后手动构建一个Listing和ContactsHolder,它们都引用了Contact。
或实现自定义ResultSetHandler。
这是一种特殊的请求,我不确定为什么你想要在这样的两个对象之间共享相同的实例。这可能就是MyBatis 3中没有这样的功能的原因。
答案 1 :(得分:0)
如果您使用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
的select来映射引用同一联系人的Listing
和ContactsHolder
条记录,那么他们将使用{i}}来查询联系人同样的身份。
Mybatis对会话中读取的所有对象使用本地缓存,因此在获取第二个关联的联系人期间,缓存将被命中,同一对象将被重用。
即使您手动执行两个查询以在同一事务中获取Listing
和ContactsHolder
,也会在两个返回的对象中使用相同的Contact
。< / p>