2016-06-29 5 views
0

について何かを欠場します。行:そしてもちろん、ドキュメントが Javaの客観化:私は有力候補に新たなんだと私は親子関係について何かを見逃して親と子供

は、私は、これは

@Entity 
public class StockRow { 

    @Parent Key<StockTable> table; 
    @Id Long id; 
    Long quantity; 
    String status; 
    String type; 
    String table; 

    private StockRow() {} 

    public StockRow (String tableName, com.google.appengine.api.datastore.Entity queryResult) { 

    id = queryResult.getKey().getId(); 
    quantity = (Long) queryResult.getProperty("quantity"); 
    status = (String) queryResult.getProperty("status"); 
    type = (String) queryResult.getProperty("stock-name"); 

    table = StockTable = Key.create(StockTable.class, tableName); 

    } 
} 

これは子供である

(私はここのためにゲッターをSUPRESS)定義された...いつものように非常に軽いです。

、親

@Entity 
public class StockTable { 

    @Id public String table; 

    private StockTable() {} 
} 

非常にシンプル。

が、私はいくつかの行のテーブルを持つようにしたい:

は、私はこれについて2つの質問があります。テーブルには同じIDの行が含まれています。 StocktableのIDは、すべての行で共有されるIDです。それが行うには正しい方法

1)ですか?私はデータストアからそれらを照会するので

StockRow sが実体でなければなりません。 は、多分それはコンテナだが、私はそれを理解していない...

または多分それは親を定義するために役に立たないのか?

2)どのように指定されたidのすべての子をロードするには?

私はObjectifのwikiにこれを読んでますが、このクエリの目的は非常に明確ではありません。

Thing th = ofy().load().type(Thing.class).parent(par).id(123L).now(); 

私が最初par内にあるかわからない、第二に、私は、この負荷は何ではないという印象を持っていますが欲しいです。

ありがとうございます!

答えて

0

:テーブルのすべての子をロードするために

。エンティティは、その種類、祖先、文字列または数値IDによって一意に識別されます。現在のモデルを使用して、名前として "A"を持つStockTableエンティティを作成するとします(Javaクラスのテーブルフィールドでマークされています)。次に、100と200のIDを持つStockRowエンティティを追加します。

StockTableキーは次のようになります。

[StockTable/"A"] 

StockRowキーは次のようになります。

[StockTable/"A", StockRow/100] 
[StockTable/"A", StockRow/200] 

客観化は、あなたが個別に各部分を指定することで、これらのキーに照会することができます:

List<StockRow> rows = ObjectifyService.ofy() 
    .type(StockRow.class) 
    .ancestor(Key.create(StockTable.class, "A")) 
    .id(100) 
    .list(); 

StockTable "A"内のすべてのStockRowエンティティに対して、01を残して照会することもできます呼び出し。

質問: "親を定義するのは無駄でしょうか?"

設計上の理由を超えて祖先を定義するのに十分な理由があります。祖先のない「トップレベル」エンティティは「エンティティグループ」を定義します。あなたの例では、それぞれの一意のStockTableはエンティティグループを表します。単一のエンティティグループ内のDatastoreクエリ(このStockTable内のすべてのStockRowを読み取るなど)は、一貫性のある結果を確実に保証するので、最新であることがわかります。結果を複数のエンティティグループに返すクエリは、最終的に一貫した結果しか保証しません。最新のものではなく、データの一貫性のあるスナップショットを反映していない可能性があります。あなたはそれについてもっと読むことができますhere

+0

ありがとう、私は今それを作るのに興味を持っています。しかし、あなたが言ったことで何か気になります:同じ種類の2つのエンティティが同じ鍵を共有できないのですか?私のデータフローの仕事ではプライマリではないキーを選択したと思うので、その場合はデータが不完全になるでしょう...私の最初の質問については、コードを修正しましたが、それはもう少し時間が必要です。 –

+0

StockRowの "id"フィールドが主キーではないことを意味しますか?鍵の一部としての種類や祖先も覚えておいてください。テーブル内でユニークな限り、あなたは大丈夫です。そうでなければ、単一の一意のキーを定義する必要があります。 – Dawson

+0

ありがとう、私はここで問題がある、私はすべてのデータを持っていないので、データストア内のStockRowsの人工キーを計算します。 Objectifyのためには、私はそれを使用しませんが、今はうまくいきませんが、助けてくれてありがとう! –

0

はい、それは正しい方法です。 StockTableは親で、複数のStockRowを持ち、行IDはテーブルごとにユニークです。あなたのデザインは罰金だ

StockTable table = ...; 
List<StockRow> rows = ofy().load() 
          .type(StockRow.class) //target type 
          .ancestor(table) //parent entity or just key 
          .list(); //all of them 
+0

答えをいただきありがとうございます。コードを更新しました。私はまだUI全体をテストする必要がありますが、まだ展開していません(もう少し時間がかかります)。私はすべてのことがうまくいくかどうかわからないように! –

関連する問題