在iBatis的圆形reverences(Circular reverences in iBatis

2019-09-29 10:12发布

我有两个类:

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的。

我该如何解决呢? 谢谢

Answer 1:

MyBatis的自动解决循环引用。 尝试这个:

<select id="x" resultMap="appleResult">
select apple.id, worm.id from apple join worm on apple.worm_id = worm.id
</select>

而两个结果映射这样的:

<resultMap id="appleResult" type="Apple">
  <id column="apple.id" property="id"/>
  <association property="worm" resultMap="wormResult">
</resultMap>
<resultMap id="wormResult" type="Worm">
  <id column="worm.id" property="id"/>
  <association property="apple" resultMap="appleResult">
</resultMap>

请注意,在这种情况下,MyBatis会检测周期和两个对象链接在一起。



文章来源: Circular reverences in iBatis