一个超级头痛的问题有一个树形结构的域列表,bu为一个域对象,getBuById为返回一个BU对象,getSubBus()函数求子域列表LIST,中间递归调用了getBuById函数,Bu对象的结构如下,
public class Bu {
/** 域或子域的编码 */
private int buId; /** 域或子域的名称 */
private java.lang.String buName; /** 域的子域列表。 */
private List subBus; /** 域或子域的父域。 */
private Bu parentBu;
}问题是如果调用getSubBus()后,再求父域BU,会进入递归死循环,打个比方,根域1有子域2和3,求1的子域为2和3,程序到了2这个地方后,又会返回来找到父域1,然后1又会找子域为2,3,如此类推,
如此看来,求子域的LIST和求父域的BU不能同时出现呀,烦呀,各位高人,有什么好办法吗?部分源码
public Bu getBuById(int buId) throws Exception {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
String sql = "select PK_BUID,FK_ParentId from Am_Bu  where PK_BuId="
+ buId;
Bu bu = new Bu();
try {
conn = DBConnect.gentconnect();
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
if (rs.next()) {
bu.setBuId(buId);
bu.setBuName(rs.getString("NAME"));
bu.setSubBus(getSubBus(buId));
bu.setParentBu(getBuById(rs.getInt("FK_PARENTID")));
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
conn.close();
}
return bu;
}
           public List getSubBus(int buId) throws Exception {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
List list = new ArrayList();
String sql = "SELECT FK_BuId FROM AM_BUPARENT_LINK WHERE FK_ParentId="
+ buId + " and FK_BUID<>" + buId;
try {
conn = DBConnect.gentconnect();
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
Bu bu = new Bu();
while (rs.next()) {
bu = getBuById(rs.getInt("FK_BUID"));
list.add(bu);
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
conn.close();
}
return list;
}

解决方案 »

  1.   

    getBuById加上一个是否读取子域的参数,
    getBuById(int buId,boolean ifGetSub),正常调用ifGetSub取true,子域调用ifGetSub取false.
    然后再修改getBuById:
    ...
    bu.setBuId(buId);
    bu.setBuName(rs.getString("NAME"));
    if(ifGetSub) //加入的语句
      bu.setSubBus(getSubBus(buId));
    bu.setParentBu(getBuById(rs.getInt("FK_PARENTID"),false));//同时修改这句
    ...
    就不会死循环了。
      

  2.   

    不好意思,子域调用的时候还是应该设置成true,在getSubBus()里把bu = getBuById(rs.getInt("FK_BUID"));改成bu = getBuById(rs.getInt("FK_BUID"),true);就没有问题了。
      

  3.   

    getSubBus()里bu = getBuById(rs.getInt("FK_BUID"),true);这句永远是TRUE吗?
      

  4.   

    getSubBus()里是不是也要加一个参数呢?
      

  5.   

    getSubBus不用。getBuById(rs.getInt("FK_BUID"),true);这句要true才能获得子域。