1

Objectifyを使用してDiagramクラスをGAEデータストアにシリアル化しています。すべてのフィールドを必要な回数だけ更新(シリアル化)できます。ただし、整数のarrowTypeIdは1回だけ更新され、その後は常に同じ値を維持します。アプリを終了して再度実行すると、その値を再度更新できますが、更新できるのは1回だけです。

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をStringに変更すると、同じ問題が発生します。

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

1 に答える 1

1

私はGAEデータストアの経験がないので、推測させてください:)。

要点がわからない、なぜあなたが作るのか

@Indexed private String diagramId;

ただし、非標準名のゲッターとセッター:

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

もう1つは、DiagramRequestコードが公開されていないことです。おそらく、問題を確認するのに役立つ可能性があります。

于 2012-11-10T22:44:23.643 に答える