2012-03-20 5 views
2

Im пытается обновить несколько записей через класс ATG, расширяющий GenericService. Тем не менее im работает против блокпост. Как выполнить множественный запрос вставки, в котором я могу продолжать добавлять все элементы/строки в кешированный объект, а затем выполнить одну команду для синхронизации с таблицей, используя item.add()?ATG Repository 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", ...}. Ваш код выглядит правильно.

Можно вызвать хранимые процедуры или выполнить пользовательский SQL через репозиторий ATG, но это обычно не рекомендуется по причинам портативности/обслуживания. Если вы это сделали, вам также нужно будет вручную очистить соответствующие части кеша item/query.

Смежные вопросы