【问题标题】:Can update field only once in GAE Datastore using Objectify使用 Objectify 只能在 GAE 数据存储中更新一次字段
【发布时间】:2012-11-11 06:44:23
【问题描述】:

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

为了更新 arroyTypeId,我调用了 sendDatabaseUpdateDiagramArrows()。这就是发生的事情:

  1. 我调用值为 1 的 sendDatabaseUpdateDiagramArrows()
  2. 我将该值设置为 DiagramProxy.setArrowTypeId()。
  3. 作为测试,我将图表标题更改为 DiagramProxy.getArrowTypeId()
  4. 我调用 save()
  5. 在 DAO save() 上,收到了错误的 ArrowTypeId 值(保留旧的),但令人惊讶的是,标题存储了第 3 步中存储的正确 ArrowTypeId)强>
  6. 更改与此问题有关。不显示任何异常。

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

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

【问题讨论】:

  • 尝试删除@Indexed 注释并将@Id 放在diagramId
  • 我删除了@Indexed 并没有什么不同(错误仍然存​​在)。我无法添加“@Id”,因为我正在扩展 Datastore,其中有“@Id”ID 和版本。因此,只需将 diagramId 视为普通字符串,而不是主键,但我将其用于查询。

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


【解决方案1】:

让我猜一下 :) 因为我没有使用 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 代码还没有发布,也许这有助于发现问题。

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    相关资源
    最近更新 更多