1. 程式人生 > >MyBatis中如何實現兩個外來鍵指向同一個類

MyBatis中如何實現兩個外來鍵指向同一個類

在運用MyBatis實現持久層的時候,我發現了一個問題,那就是如果一張表中有兩個外來鍵,名字不一樣,但是其實指向的是同一個類,例如:在一根光纖FIber上,有兩端,兩端分別就是光口ODF,命名的時候一個叫ODFPort,一個叫做NextODFPort。怎麼實現呢?下面給出我的方法。

先定義好ODFPort和NextODFPort的resultMap:

<resultMap type="ODFPort" id="resultODFPort">
		<id column="odfportid" property="odfportid" />
		<result column="odfp_serialnum" property="serialnum" />
		<result column="odfp_status" property="status" />
	</resultMap>

	<resultMap type="ODFPort" id="resultNextODFPort">
		<id column="odfportid" property="odfportid" />
		<result column="odfp_serialnum" property="serialnum" />
		<result column="odfp_status" property="status" />
	</resultMap>

	<select id="selectODFPort" parameterType="int" resultMap="resultODFPort">
		select
		odfportid,serialnum as odfp_serialnum,status as
		odfp_status from odfport where odfportid=#{odfportid}
	</select>

	<select id="selectNextODFPort" parameterType="int" resultMap="resultNextODFPort">
		select
		odfportid,serialnum as odfp_serialnum,status as
		odfp_status from odfport where odfportid=#{odfportid}
	</select>
然後就是把Fiber的resultMap通過association這個標籤把ODFPort和NextODFPort連線起來。
<resultMap type="FiberPort" id="resultFiberPort">
		<id column="fiberportid" property="fiberportid" />
		<result column="fiberport_status" property="status" />
		<association property="odfport" column="odfportid" select="selectODFPort" />
		<association property="nextodfport" column="nextodfportid"
			select="selectNextODFPort" />
	</resultMap>

這種辦法還有另外一些好處,這樣把每張表都分開寫一個select,結構會很清楚,每張表只通過association連線,每張表之間相對獨立,這樣也避免了在聯合查詢的時候,每張表中的個別列名相同衝突。