API репозитория ATG - PullRequest
       8

API репозитория ATG

2 голосов
/ 20 марта 2012

Я пытаюсь обновить несколько записей через класс ATG, расширяющий GenericService. Однако я бегу против контрольно-пропускного пункта. Как мне выполнить множественный запрос вставки, где я могу продолжать добавлять все элементы / строки в кешируемый объект, а затем выполнять синхронизацию одной команды с таблицей с помощью item.add ()?

Пример кода

первая часть - очистить строки в таблице до того, как произойдет вставка (очень полезно, если кто-нибудь знает способ очистить все строки в таблице без необходимости проходить и удалять одну за другой).

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

Ответы [ 2 ]

4 голосов
/ 17 августа 2012

То, как я интерпретирую ваш вопрос, заключается в том, что вы хотите добавить несколько элементов репозитория в свой репозиторий, но хотите сделать это довольно эффективно на уровне базы данных.Я предлагаю вам использовать API транзакций Java, как рекомендовано в документации ATG , например:

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 голосов
/ 28 ноября 2012

ATG не поддерживает удаление нескольких записей в одном операторе SQL.Вы можете использовать транзакции, как предлагает @chrisjleu, но нет способа сделать эквивалент DELETE WHERE ID IN {"1", "2", ...}.Ваш код выглядит правильно.

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

...