代码拉取完成,页面将自动刷新
DoInsertLinkVisitor,中 36 行为什么要用 Lang.each 递归操作,同理 DoDeleteLinkVisitor 也是这样,我用测试用例发现 这样会生成多条语句,去掉 Lang.each 递归操作 只会保留两条语句本体和依赖。
请问作者是基于什么考虑设计需要递归?
public class DoInsertLinkVisitor extends AbstractLinkVisitor {
public void visit(final Object obj, final LinkField lnk) {
final Object value = lnk.getValue(obj);
if (Lang.eleSize(value) == 0)
return;
// 从宿主对象更新关联对象
opt.add(Pojos.createRun(new PojoCallback() {
public Object invoke(Connection conn, ResultSet rs, Pojo pojo, Statement stmt) throws SQLException {
lnk.updateLinkedField(obj, value);
return pojo.getOperatingObject();
}
}).setOperatingObject(obj));
// 为其循环生成插入语句 : holder.getEntityBy 会考虑到集合和数组的情况的
final Entity<?> en = lnk.getLinkedEntity();
//==========================================
// 此处有疑问?是否可以去掉 Lang.each
//==========================================
Lang.each(value, new Each<Object>() {
public void invoke(int i, Object ele, int length) throws ExitLoop, LoopException {
if (ele == null)
throw new NullPointerException("null ele in linked field!!");
// 执行插入
opt.addInsert(en, ele);
// 更新字段
opt.add(Pojos.createRun(new PojoCallback() {
public Object invoke(Connection conn, ResultSet rs, Pojo pojo, Statement stmt)
throws SQLException {
lnk.saveLinkedField(obj, pojo.getOperatingObject());
return pojo.getOperatingObject();
}
}).setOperatingObject(ele));
}
});
}
}