通过 Objectify 在 Datastore 中保存递归对象
Saving a recursive object in Datastore via Objectify
我有一个用例,我必须保存一个递归对象
两个 类 :
public class Item{
@Id
private Long id;
@Index
private String name;
@Index
private String sku;
@Index
private Long shopId;
@Index
private String imageUrl="";
@Index
private List<Long>optionIds;
private List<Option> options;
}
public class Option{
@Id
private Long id;
@Index
private String name;
@Index
private String sku;
@Index
private Long shopId;
@Index
private String imageUrl="";
@Index
private List<Long>itemIds;
private List<Item> items;
}
我也将这两个对象分别保存在两个不同的 table 中。
为此,我需要在 Item 模型的 List 字段上添加 @Ignore
和选项模型中列表字段上的@Ignore。
我现在需要一个完整的递归结构,并想将其保存在另一个 table 中。
为此,我尝试通过将 @IgnoreSave(IfNull.class) 放在 Item 模型的 List 字段和 Option 模型的 List 字段上来尝试破解。
但是当我在执行上述操作后启动应用程序时,出现了 Whosebug 错误。错误属于以下类型:
java.lang.WhosebugError
at java.security.AccessController.doPrivileged(Native Method)
at sun.reflect.annotation.AnnotationInvocationHandler.getMemberMethods(AnnotationInvocationHandler.java:284)
at sun.reflect.annotation.AnnotationInvocationHandler.equalsImpl(AnnotationInvocationHandler.java:196)
at sun.reflect.annotation.AnnotationInvocationHandler.invoke(AnnotationInvocationHandler.java:63)
at com.sun.proxy.$Proxy9.equals(Unknown Source)
at java.util.Arrays.equals(Arrays.java:1869)
at com.googlecode.objectify.impl.translate.TypeKey.equals(TypeKey.java:60)
at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:996)
at com.googlecode.objectify.impl.translate.Translators.get(Translators.java:115)
at com.googlecode.objectify.impl.translate.CreateContext.getTranslator(CreateContext.java:27)
at com.googlecode.objectify.impl.KeyMetadata.findKeyFields(KeyMetadata.java:78)
at com.googlecode.objectify.impl.KeyMetadata.<init>(KeyMetadata.java:50)
at com.googlecode.objectify.impl.translate.ClassTranslatorFactory.createEntityClassTranslator(ClassTranslatorFactory.java:64)
我现在被困住了,急需帮助。是否有通过 objectify 存储递归结构的替代解决方案?
您似乎在尝试保存两个相互引用的不同实体。为此,您应该使用 Key<?>
或 Ref<?>
字段。这样的指针递归没问题
通过指定 List<Item>
和 List<Option>
,您告诉 Objectify 您想要 嵌入 这些东西递归到一个实体中。 Objectify 不支持递归嵌入 类(至少,现在还没有)。
我有一个用例,我必须保存一个递归对象
两个 类 :
public class Item{
@Id
private Long id;
@Index
private String name;
@Index
private String sku;
@Index
private Long shopId;
@Index
private String imageUrl="";
@Index
private List<Long>optionIds;
private List<Option> options;
}
public class Option{
@Id
private Long id;
@Index
private String name;
@Index
private String sku;
@Index
private Long shopId;
@Index
private String imageUrl="";
@Index
private List<Long>itemIds;
private List<Item> items;
}
我也将这两个对象分别保存在两个不同的 table 中。 为此,我需要在 Item 模型的 List 字段上添加 @Ignore 和选项模型中列表字段上的@Ignore。
我现在需要一个完整的递归结构,并想将其保存在另一个 table 中。 为此,我尝试通过将 @IgnoreSave(IfNull.class) 放在 Item 模型的 List 字段和 Option 模型的 List 字段上来尝试破解。
但是当我在执行上述操作后启动应用程序时,出现了 Whosebug 错误。错误属于以下类型:
java.lang.WhosebugError
at java.security.AccessController.doPrivileged(Native Method)
at sun.reflect.annotation.AnnotationInvocationHandler.getMemberMethods(AnnotationInvocationHandler.java:284)
at sun.reflect.annotation.AnnotationInvocationHandler.equalsImpl(AnnotationInvocationHandler.java:196)
at sun.reflect.annotation.AnnotationInvocationHandler.invoke(AnnotationInvocationHandler.java:63)
at com.sun.proxy.$Proxy9.equals(Unknown Source)
at java.util.Arrays.equals(Arrays.java:1869)
at com.googlecode.objectify.impl.translate.TypeKey.equals(TypeKey.java:60)
at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:996)
at com.googlecode.objectify.impl.translate.Translators.get(Translators.java:115)
at com.googlecode.objectify.impl.translate.CreateContext.getTranslator(CreateContext.java:27)
at com.googlecode.objectify.impl.KeyMetadata.findKeyFields(KeyMetadata.java:78)
at com.googlecode.objectify.impl.KeyMetadata.<init>(KeyMetadata.java:50)
at com.googlecode.objectify.impl.translate.ClassTranslatorFactory.createEntityClassTranslator(ClassTranslatorFactory.java:64)
我现在被困住了,急需帮助。是否有通过 objectify 存储递归结构的替代解决方案?
您似乎在尝试保存两个相互引用的不同实体。为此,您应该使用 Key<?>
或 Ref<?>
字段。这样的指针递归没问题
通过指定 List<Item>
和 List<Option>
,您告诉 Objectify 您想要 嵌入 这些东西递归到一个实体中。 Objectify 不支持递归嵌入 类(至少,现在还没有)。