5

Objectify を使用して保持したいこのクラスがあります。このクラスは 1MB を超えるデータを表すため、サイズが 1MB 未満の格納されたバイト配列のフラグメントを表す Blob オブジェクトのリストがあります。

@Entity
public class BigBlob {

    @Id
    private Long id;
    public static final int FRAGMENT_LIMIT = 777 * 1024;
    @Serialized
    private List<Blob> fragments = new ArrayList<Blob>();

    ...

}

それでも、「フラグメント」は @Serialized であり、この BigBlob クラス/オブジェクトのサイズが 1MB を超えてレンダリングされます。

このエラーの原因:

com.google.apphosting.api.ApiProxy$RequestTooLargeException: The request to API call datastore_v3.Put() was too large.

@Embedded アノテーションを使用すると、次のエラーが発生します。

Cannot place array or collection properties inside @Embedded arrays or collections

「フラグメント」が別のエンティティとして保存されていることを確認するにはどうすればよいですか?

ところで、私はすでにバイト配列全体を切り刻んでフラグメントをListofに入れるバイトチャンクロジックを持っているBlobので、この質問はバイトを切り刻む方法には関係ありません。

ほとんどの場合、私が知りたいのは永続的な側面です。

4

2 に答える 2

4

Blobstore に保存し、Blobkey を Objectify に保存する必要があります。Objectify は、ブロブストアではなく、データストア上で機能します。

于 2012-05-21T17:50:01.900 に答える
2

リックの答えは本当に最高です-特にGAEに不慣れで、データストアに概念的な問題がある場合は、blobをblobstoreに格納します。

一方、特に1Mエッジに近いデータを保存する場合は、blobの保存に分割エンティティを使用する理由がいくつかあります。100MBのBLOBでこれを実行することは望ましくありませんが、2MBのBLOBは理にかなっています。

まず第一に、シリアル化または埋め込みは必要ありません。これらは、単一のエンティティ内でデータを構造化するための単なる方法です。

また、BLOBをエンティティ間で分割できる魔法の注釈はありません。あなたはそれをすべて手でしなければなりません。「マスター」またはルートエンティティを実際に作成する必要はありません。idで定義された親(実際のエンティティは含まない)を使用してすべてのエンティティフラグメントを作成し、ancestor()クエリを使用してすべてのピースをフェッチするだけです。

于 2012-05-21T19:55:16.677 に答える