在运用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连接,每张表之间相对独立,这样也避免了在联合查询的时候,每张表中的个别列名相同冲突。