簡體   English   中英

myBatis多對多關系

[英]myBatis Many To Many Relationship

關於我之前有關myBatis中映射的問題,我現在在進行多對多關系時遇到問題

我有以下對象

//由於隱私問題,我無法發布實際的對象定義和XML

class ObjectA {
     List<Items> items;
     List<Products> products;

     //getters setters
}

class Items {
   int id;
   String description;
   List<Tags> tags;
}

class Tags {
    int id;
    int item_id;
    String tag;
}

SQL涉及將Items表與Tags表ON Tags.ITEM_ID = Items.ID

基本上,它返回行並將其映射到此myBatis

<resultMap id="getObjectA" type="ObjectA">
    <collection property="items" javaType="ArrayList" ofType="Items" resultMap="getItems"/>

     ...

</resultMap>

<resultMap="getItems" type="Items">
    <id property="id" column="ITEMS.id"/>
    <result property="description" column="ITEMS.description"/>
    <collection property="tags" javaType="ArrayList" ofType="Tags" resultMap="getTags"/>
</resultMap>

<resultMap id="getTags" type="Tags">
   <id property="id" column="TAGS.id"/>
   <result property="item_id" column="TAGS.item_id"/>
   <result property="tag" column="TAGS.tag"/>
</resultMap>

從技術上講,該設置工作並返回一個ObjectA,其中包含一個項目列表,每個項目列表都包含一個標簽列表。 如果每個項目只有一個標簽,則映射很好,但是當一個項目包含多個標簽時,它將創建多個具有相同ID的項目,每個項目都包含一個列表,該列表僅包含來自查詢結果的一個標簽。

創建父對象重復項的事實意味着mybatis無法正確識別對象,即<id property="id" column="ITEMS.id"/>不能按預期工作。 基本上需要id元素,以便mybatis知道在結果集中的多行中重復的父記錄引用的是同一對象。

一種可行的選擇是確保不同表中的列具有唯一名稱,並在結果圖中使用該唯一名稱。

對於您而言,映射器示例應如下所示:

<resultMap type="ObjectA" id="objectaMap">
    <id column="id" property="id"/>
    <collection property="items" javaType="ArrayList" ofType="Items" columnPrefix="ITEM_">
        <id column="id" property="id"/>
        <result property="description" column="description"/>
        <collection property="tags" javaType="ArrayList" ofType="Tags" columnPrefix="TAG_">
            <id column="id" property="id"/>
            <result property="tag" column="tag"/>
        </collection>
    </collection>
</resultMap>

<select id="getObjects" resultMap="objectaMap">
    select o.*, i.id as ITEM_ID, i.description as ITEM_DESCRIPTION, t.id as ITEM_TAG_ID, t.tag as ITEM_TAG_TAG
    from objecta o
        join items i on (i.object_id = o.id) 
        join tags t on (t.item_id = i.id)
</select>

請注意, items表中的所有列如何具有ITEM_前綴, tags表如何相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM