2011-11-04 77 views
0

這是我的第一個問題,所以請讓我知道是否有任何我可以提供的問題來使我的問題更清晰。謝謝!MyBatis:控制對象的創建與參照現有對象

有沒有辦法調整MyBatis(3.0.4),這樣當它通過嵌套結果映射運行並基於結果創建對象時,它不會創建「重複」對象,而是引用已經存在的對象被創建?爲了澄清,讓我們說我有一個包含以下(簡化)信息的對象:

Public class PrimaryObject { 
    Private Contact role1; 
    Private Contact role2; 
    Private List<OtherObject> otherObjects; 
} 

Public class OtherObject { 
    Private String otherProperty; 
    Private Contact otherRole; 
} 

而結果地圖/ SQL(假設類型別名):

<mapper namespace="PrimaryObject"> 
    <resultMap id="primaryObject" type="primaryObject"> 
     <association property="role1" column="ROLE_1_ID" 
     select="Contact.findContactByPK" /> 
     <association property="role2" column="ROLE_2_ID" 
     select="Contact.findContactByPK" /> 
     <collection property="otherObjects" column="PRIMARY_OBJECT_ID" 
     javaType="List" ofType="OtherObject" 
     select="OtherObject.findOtherObjectsByPrimaryObjectPK" /> 
    </resultMap> 
    <select id="selectPrimaryObjectByPK" parameterType="..." 
    resultMap="primaryObject"> 
     SELECT * FROM PRIMARY_OBJECT_TABLE 
     WHERE PRIMARY_OBJECT_ID = #{value} 
    </select> 

...

<mapper namespace="OtherObject"> 
    <resultMap id="otherObject" type="otherObject"> 
     <result property="otherProperty" column="OTHER_PROPERTY" /> 
     <association property="otherRole" column="OTHER_ROLE_ID" 
     select="Contact.findContactByPK" /> 
    </resultMap> 
    <select id="findOtherObjectsByPrimaryObjectPK" parameterType="..." 
    resultMap="otherObject"> 
     SELECT OTHER_OBJECT.OTHER_PROPERTY, OTHER_OBJECT.OTHER_ROLE_ID 
     FROM OTHER_OBJECT JOIN PRIMARY_OBJECT 
      ON PRIMARY_OBJECT.PRIMARY_OBJECT_ID = OTHER_OBJECT.PRIMARY_OBJECT_ID 
    </select> 

...

<mapper namespace="Contact"> 
    <resultMap id="contact" type="Contact"> 
     <result property... 
     ... 
    </resultMap> 
    <select id="findContactByPK" parameterType="..." resultMap="contact"> 
     SELECT * FROM CONTACT... 
    </select> 

現在讓我們假設一個聯繫人在primaryObject上同時扮演role1role2的角色。根據我所看到的,MyBatis創建role1中引用的聯繫人對象,當它遇到role2時,它只會引用它爲role1創建的對象。那很棒!

但是,讓我們假設同一聯繫人在otherObject中充當otherRole。 MyBatis現在創建一個完全相同的聯繫人對象,而不是僅僅參考製作primaryObject時創建/引用的原始contact。有什麼辦法可以防止這種情況發生,而只是在我的otherObject中存儲一個引用,指出primaryObject中兩個不同字段指向的相同contact?我一直在尋找custom ResultHandler,但這個例子的複雜性加上我缺乏經驗,使我無法理解它是否能解決我首先想解決的問題。預先感謝您的幫助和耐心!

+0

歡迎來到堆棧溢出!我認爲你的問題很好。如果你還沒有偶然發現它,我推薦閱讀FAQ,http://stackoverflow.com/faq。 – Andy

回答

0

好的,我認爲你的問題可能是How to map a myBatis result to multiple objects?的重複。所以,如果我正確地理解了這個問題,沒有MyBatis不支持這個問題。

您應該小心使用嵌套選擇,因爲它們會在數據庫上執行添加選擇語句。我建議查看MyBatis 3 User Guide,特別是在第35頁左右。 MyBatis有非常強大的方法來避免n + 1選擇問題。 What is SELECT N+1?

+0

感謝您的信息!我的問題與@ holic87發佈的問題非常相似,但我更關心的是阻止新對象在結果集創建之前得到實例化,而不是在之後操作對象。我認爲這可能是可能的插件,我現在正在通過一些想法。如果我偶然發現任何問題,我一定會更新這個問題。再次感謝! – molo