我有这个类我想用Objectify持久化,这个类将代表一个大于1MB的数据,所以有一个Blob对象列表,表示存储的字节数组的片段,其大小小于1MB:
@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
如何确保“片段”作为单独的实体存储?
BTW,我已经有了字节分块逻辑,它会切断整个字节数组并将片段放入List
Blob
中,所以这个问题与如何切换字节无关。
大多数我想知道的更多是坚持不懈的一面。
答案 0 :(得分:4)
您应该将它存储在Blobstore中,并将Blobkey保存在Objectify中。 Objectify在数据存储区之上工作,而不是blobstore。
答案 1 :(得分:2)
Rick的答案实际上是blobstore中最好的商店blob,特别是如果你是GAE的新手并且对数据存储有概念性问题。
另一方面,使用拆分实体存储blob有一些很好的理由,特别是如果要存储接近1M边缘的数据。您不希望使用100MB blob执行此操作,但2MB blob可能有意义。
首先,您不希望序列化或嵌入。这些只是在单个实体内构建数据的简单方法。
此外,没有神奇的注释可以让你跨实体分割blob。你必须手工完成所有这些。您不需要实际创建“主”或根实体;只需使用由id(但没有实际实体)定义的父项创建所有实体片段,并使用ancestor()查询来获取所有片段。