繁体   English   中英

ATG储存库API

[英]ATG Repository API

我试图通过扩展GenericService的ATG类来更新多个记录。 但是即时通讯遇到了障碍。 如何执行多次插入查询,在此查询中我可以继续将所有项目/行添加到缓存的对象中,然后使用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) ;
        }

我对问题的解释方式是,您想向存储库中添加多个存储库项目,但是要在数据库级别上相当有效地完成它。 我建议您按照ATG文档中的建议使用Java Transaction API ,如下所示:

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存储库,则在每次调用addItem之后都会发出SQL INSERT语句,但是直到/如果事务成功完成,才提交SQL INSERT语句。

ATG不支持在单个SQL语句中删除多个记录。 您可以使用事务,如@chrisjleu所建议的那样,但是没有办法等效于DELETE WHERE ID IN {"1", "2", ...}中的DELETE WHERE ID IN {"1", "2", ...} 您的代码看起来正确。

可以通过ATG存储库调用存储过程或执行自定义SQL,但是出于可移植性/维护性的原因,通常不建议这样做。 如果这样做,则还需要手动刷新项目/查询缓存的适当部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM