首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CouchDB中使用Java和Ektorp的BulkUpdate

在CouchDB中使用Java和Ektorp的BulkUpdate
EN

Stack Overflow用户
提问于 2012-05-27 02:23:37
回答 1查看 953关注 0票数 1

我有一个从org.ektorp.support.CouchDbDocument派生的类:

代码语言:javascript
复制
@TypeDiscriminator( value="doc.type == 'TYPE_PRODUCT' )
public class Product extends CouchDbDocument { 
....

还有一个存储库类:

代码语言:javascript
复制
public class ProductRepo extends CouchDbRepositorySupport<Product> { ....

repository类有一个方法:

代码语言:javascript
复制
public List<DocumentOperationResult> executeBulk( Set<Product> bulk ) {
    return db.executeBulk( bulk );
}

该方法用于创建和更新项。创建进行得很顺利。但是在更新时,Ektorp抛出了这个异常:

代码语言:javascript
复制
Caused by: java.lang.IllegalStateException: cannot set id, id already set
    at org.ektorp.support.CouchDbDocument.setId(CouchDbDocument.java:39)
... 18 more

我要做的是发送一组对象,这些对象最初是由同一存储库中的一个视图获取的--当然,这些对象确实有一个非空Id。这当然不应该发生,因为对象确实有一个id,并且必须更新,而不是创建。根据Ektorp文档,db.executeBulk应该同时处理文档的创建和更新。

在CouchDbDocument.setId中抛出异常:

代码语言:javascript
复制
@JsonProperty("_id")
public void setId(String s) {
  Assert.hasText(s, "id must have a value");
  if (id != null && id.equals(s)) {
    return;
  }
  if (id != null) {
    throw new IllegalStateException("cannot set id, id already set");
  }
  id = s;
}

但是为什么呢?发送的对象确实设置了Id (也设置了修订版),因此Ektorp应该检测到我们正在讨论的是现有对象,而不是尝试为它们生成新的id。有人知道如何解决这个问题吗?或者在这种情况下,解决方案是抛弃Ektorp,转而使用纯json而不是http吗?

(项目在Jboss 7.1.1.Final,CouchDB 1.2.0,Ektorp 1.2.2上运行)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-27 15:41:19

Ektorp中的批量操作响应处理程序不检查id是否已设置。当批量对象扩展不允许多次设置id的CouchDbDocument时,这会导致问题。这认为这是一个错误,它将在Ektorp 1.3.0中修复

版本1.3.0之前的变通方法是覆盖产品类中的setId,并稍微放宽断言。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10768709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档