插入父/子关系的ibatis

时间:2012-03-07 00:09:19

标签: ibatis

我有经典的设置

public class Parent {
        String name;
        Collection<Child> children;

    private class child{
      string name;
    }
}

现在我想首先在父表中插入父属性,然后获取id并最终存储子记录。在ibatis中实现相同的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:使用iBatis(我正在使用iBatis版本2.3.4,因此这个例子基于此)。创建一批语句可以提高性能。同样重要的是要注意将批处理包装在单个事务中,就像它没有被包装一样,然后将为每个语句启动一个新事务(性能可能是一个问题,具体取决于我认为的批量大小)。

见下面的例子。您会注意到批处理startBatch()的开始仅在更新或插入父记录后启动。这是因为在调用executeBatch()之前,不会生成数据库生成的密钥。这意味着如果您使用selectKey使用生成的密钥更新对象,则它们将返回null。这就是父记录的创建/更新在startBatch()语句之前的原因。希望这有助于您作为一个例子。

try {
    sqlMap.startTransaction();

    if (parent.getId == null) {
       sqlMap.insert("createParent", parent);
    } else {
       sqlMap.update("updateParent", parent);
    }

    sqlMap.startBatch();
    for (final Child exapleChild: parent.getChildren()) {
        exapleChild.setParentId(parent.getId);
        sqlMap.insert("createChildForParent", objectReference1);
    }
    sqlMap.executeBatch();
    sqlMap.commitTransaction();
} catch (final SQLException e) {
    throw new XXXException(e);
} finally {
    try {
        sqlMap.endTransaction();
    } catch (SQLException e) {
        throw new XXXException(e);
    }
}