我有两个类:
class Apple {
Worm worm;
}
class Worm {
Apple apple;
}
它们存储在数据库中的1:1点的方式:
table Apple(id, wormId)
table Worm(id)
每个苹果只有一个蠕虫病毒,反之亦然。
随着出iBatis的,我可以简单地做到这一点:
Worm worm = new Worm();
Apple apple = new Apple();
worm.setApple(apple);
apple.setWorm(worm);
我怎样才能做到这一点在ibatis的?
<resultMap id="Apple" type="Apple">
<result property="id" column="id"/>
<result property="worm" column="id" select="getWormByApple"/>
</resultMap>
<resultMap id="Worm" type="Worm">
<result property="id" column="id"/>
<result property="apple" column="id" select="getAppleByWorm"/>
</resultMap>
<select id="getApple" resultMap="Apple" parameterClass="java.lang.Long">
SELECT * FROM Apples where id=#value#
</select>
<select id="getWormByApple" resultMap="Worm" parameterClass="java.lang.Long">
SELECT * FROM Worms where appleId=#value#
</select>
所以,我希望能够做到:
Apple apple = foo.queryForObject("getApple", 42L);
Worm = worm.getApple();
Apple appleAgain = apple.getWorm().getApple();
// apple == appleAgain here
相反,我得到StackOverFlowException因为支柱调用getWormByApple / getApple永远。
我看到这里只有一个解决方案:
class Apple {
void setWorm(Worm worm){
this.worm = worm;
worm.setApple(this);
}
...和蠕虫的resultMap删除“属性=”苹果“”。
但它吮吸,因为我必须记住哪个设定装置更新的说法,并没有。 它也因恶劣可能导致无限循环的情况下,当蠕虫的setter会改变说法。
我也不想“修复” iBatis的泄漏与我的模型类(即我不想碰我的模型bean的话)。
这将是很好有某种“后处理器”的:
<resultMap id="Apple" type="Apple">
<result property="id" column="id"/>
<result property="worm" select="getWormByApple"/>
<result property="worm.apple" postProcessor="appleToWormSetter"/>
</resultMap>
但没有任何iBatis的。
我该如何解决呢? 谢谢