我试图通过扩展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) ;
}
最佳答案
我对您的问题的解释方式是,您想向存储库中添加多个存储库项目,但是要在数据库级别相当有效地执行此操作。我建议您使用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存储库,则在每次调用
addItem
之后都会发出SQL INSERT语句,但是直到/如果事务成功完成,才提交SQL INSERT语句。