這是我的第一個問題,所以請讓我知道是否有任何我可以提供的問題來使我的問題更清晰。謝謝!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
上同時扮演role1
和role2
的角色。根據我所看到的,MyBatis創建role1
中引用的聯繫人對象,當它遇到role2
時,它只會引用它爲role1
創建的對象。那很棒!
但是,讓我們假設同一聯繫人在otherObject
中充當otherRole
。 MyBatis現在創建一個完全相同的聯繫人對象,而不是僅僅參考製作primaryObject
時創建/引用的原始contact
。有什麼辦法可以防止這種情況發生,而只是在我的otherObject
中存儲一個引用,指出primaryObject
中兩個不同字段指向的相同contact
?我一直在尋找custom ResultHandler,但這個例子的複雜性加上我缺乏經驗,使我無法理解它是否能解決我首先想解決的問題。預先感謝您的幫助和耐心!
歡迎來到堆棧溢出!我認爲你的問題很好。如果你還沒有偶然發現它,我推薦閱讀FAQ,http://stackoverflow.com/faq。 – Andy