可以使用Objectify在GAE数据存储区中仅更新一次字段

时间:2012-11-02 10:12:11

标签: java gwt google-cloud-datastore requestfactory objectify

我使用Objectify将Diagram类序列化为GAE数据存储区。我可以根据需要多次更新(序列化)所有字段,但Integer arrowTypeId除外,它只更新一次,之后始终保持相同的值。如果我离开应用程序并再次运行它,我可以再次更新该值,但只能更新一次。

更新arroyTypeId我正在调用sendDatabaseUpdateDiagramArrows()。这就是:

  1. 我使用值1
  2. 调用sendDatabaseUpdateDiagramArrows()
  3. 我将该值设置为DiagramProxy.setArrowTypeId()。
  4. 作为测试,我将图表标题更改为DiagramProxy.getArrowTypeId()
  5. 我叫save()
  6. 在DAO save()上,收到了错误的ArrowTypeId值(保留旧值),但令人惊讶的是,Title有从步骤3中存储的右箭头ID)
  7. 此问题序列化了更改。没有显示例外。

    • 请注意,我可以第一次更新ArrowTypeId值,从默认值1到2.但下次保持值始终为2。
    • 编辑:如果我将arrowTypeId更改为String,我会遇到同样的问题。
  8. DatabaseUtils.java

    public static DiagramProxy sendDatabaseUpdateDiagramArrows(DialectiveRequestFactory requestFactory, Integer value, DiagramProxy cellDiagramProxy)
    {
        DiagramRequest diagramRequest = requestFactory.diagramRequest();
        DiagramProxy newDiagramProxy = diagramRequest.edit(cellDiagramProxy);
        Date date = new Date();
    
        newDiagramProxy.setArrowTypeId(value);
        newDiagramProxy.setTitle(Integer.toString(newDiagramProxy.getArrowTypeId()));
        diagramRequest.save(newDiagramProxy).fire();
    
        return cellDiagramProxy;
    }
    

    Diagram.java

    @Entity
    public class Diagram extends DatastoreObject{
    
    
    @Indexed private String diagramId;
        private String title;
        private Integer arrowTypeId;
    
        public String get_id() {
            return diagramId;
        }
        public void set_id(String diagramId) {
            this.diagramId = diagramId;
        }
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        public Integer getArrowTypeId() {
            return arrowTypeId;
        }
        public void setArrowTypeId(Integer arrowTypeId) {
            this.arrowTypeId = arrowTypeId;
        }
    }
    

    DiagramProxy.java

    @ProxyFor(value = Diagram.class, locator = ObjectifyLocator.class)
    public interface DiagramProxy extends EntityProxy{
        void set_id(String id);
        void setTitle(String title);
        void setArrowTypeId(Integer arrowTypeId);
        Integer getArrowTypeId();
        String get_id();
        String getTitle();
    }
    

    DiagramDao.java

    public class DiagramDao extends ObjectifyDao<Diagram>{
    
        public void save(Diagram diagram)
        {
            this.put(diagram);
        } }
    

1 个答案:

答案 0 :(得分:2)

让我猜:)因为我没有GAE数据存储的经验。

我不明白,为什么要做

@Indexed private String diagramId;

但是使用非标准名称的getter和setter:

public String get_id() {
    return diagramId;
}
public void set_id(String diagramId) {
    this.diagramId = diagramId;
}

我宁愿选择:

@Indexed private String diagramId;
public String getDiagramId() {
        return diagramId;
    }
    public void setDiagramId(String diagramId) {
        this.diagramId = diagramId;
    }

还有一件事是DiagramRequest代码尚未发布,可能有助于查看问题。