2012-03-07 75 views
0

我有經典設置ibatis的插入父/子關係

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

    private class child{ 
     string name; 
    } 
} 

現在我要插入父第一屬性父表,比獲得ID,最後店子records.whats實現的最佳途徑在ibatis中是一樣的嗎?

回答

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); 
    } 
}