2012-03-20 51 views
2

我試圖通過擴展GenericService的ATG類更新多個記錄。 但即時通過路障運行。 如何做一個多插入查詢,我可以繼續添加所有的項目/行到緩存的對象,然後使用item.add()與表執行單個命令同步?ATG存儲庫API

示例代碼

第一部分是清除了在表中的行插入發生(威武有用之前,如果有人的方式通過清除表中的所有行,而不通過其循環和刪除一個知道一)。

MutableRepository repo = (MutableRepository) feedRepository; 
    RepositoryView view = null; 

    try{ 
     view = getFeedRepository().getView(getFeedRepositoryFeedDataDescriptorName()); 
     RepositoryItem[] items = null; 
     if(view != null){   
      QueryBuilder qb = view.getQueryBuilder(); 
      Query getFeedsQuery = qb.createUnconstrainedQuery(); 
      items = view.executeQuery(getFeedsQuery); 
     } 
     if(items != null && items.length>0){ 
      // remove all items in the repository 
      for(RepositoryItem item :items){ 
       repo.removeItem(item.getRepositoryId(), getFeedRepositoryFeedDataDescriptorName()); 
      } 
     } 



     for(RSSFeedObject rfo : feedEntries){ 
      MutableRepositoryItem feedItem = repo.createItem(getFeedRepositoryFeedDataDescriptorName()); 

      feedItem.setPropertyValue(DB_COL_AUTHOR, rfo.getAuthor()); 
      feedItem.setPropertyValue(DB_COL_FEEDURL, rfo.getFeedUrl()); 
      feedItem.setPropertyValue(DB_COL_TITLE, rfo.getTitle()); 
      feedItem.setPropertyValue(DB_COL_FEEDURL, rfo.getPublishedDate()); 

      RepositoryItem item = repo.addItem(feedItem) ; 
     } 

回答

4

我理解你的問題的方法就是要多資源庫項目添加到您的資料庫,但要在數據庫級別相當有效地做到這一點。我建議你利用Java Transaction API as recommended in the ATG documentation的,就像這樣:

TransactionManager tm = ... 
TransactionDemarcation td = new TransactionDemarcation(); 
try { 
    try { 
    td.begin (tm); 

    ... do repository item work ... 
    } 
    finally { 
    td.end(); 
    } 
} 
catch (TransactionDemarcationException exc) { 
    ... handle the exception ... 
} 

假設你在你的例子使用一個SQL資料庫,在SQL INSERT語句將每次調用addItem後發出,但不會被提交,直到/如果該事務成功完成。

0

ATG不支持在單個SQL語句中刪除多個記錄。您可以使用交易,如@chrisjleu所示,但無法執行與DELETE WHERE ID IN {"1", "2", ...}等價的交易。你的代碼看起來正確。

可以通過ATG存儲庫調用存儲過程或執行自定義SQL,但通常不推薦將其用於可移植性/維護原因。如果你這樣做了,你還需要手動刷新項目/查詢緩存的適當部分。