0

如果我有一个带有类文字作为字段的 POJO,我可以将它保存在 Objectify 中吗?

private Class<Foo> fooType;

这些文档似乎另有建议,但我想我只需检查一下即可:

http://code.google.com/p/objectify-appengine/wiki/IntroductionToObjectify

https://developers.google.com/appengine/docs/java/datastore/entities#Properties_and_Value_Types

4

2 回答 2

3

默认情况下,没有。但是,您可以相当容易地添加一个翻译器,它将一个类作为一个字符串本地存储在数据存储中。您在保存时使用 Class.getName(),在加载时使用 Class.forName()。

以下是在 Objectify3 中执行操作的示例:

http://code.google.com/p/objectify-appengine/source/browse/tags/3.1/src/com/googlecode/objectify/impl/conv/joda/DateTimeZoneConverter.java

请注意,如果类型与转换器无关,则在单个转换器中返回 null。此处描述了如何启用它:

http://code.google.com/p/objectify-appengine/source/browse/tags/3.1/src/com/googlecode/objectify/impl/conv/joda/JodaTimeConverters.java

这是 Objectify4 中的等价物:

http://code.google.com/p/objectify-appengine/source/browse/trunk/src/com/googlecode/objectify/impl/translate/opt/joda/DateTimeZoneTranslatorFactory.java

此处描述了如何启用它:

http://code.google.com/p/objectify-appengine/source/browse/trunk/src/com/googlecode/objectify/impl/translate/opt/joda/JodaTimeTranslators.java

于 2012-04-04T16:28:37.987 回答
1

Objectify 只能持久化 GAE Datastore 支持的类型。Java 类型Class不是其中之一。

此外,由于类型擦除,字段fooType不包含通用参数信息。

现在,有几种存储Class类型的方法:

  1. 只存储类的长名称,通过@PrePersist/@PostLoad 转换。这样做的好处是您将获得一个可以查询的普通字符串属性。

    @Transient // tells Objectify to ignore field
    public Class<Foo> fooType;
    
    @PrePersist
        public prePersist(Entity entity){
        entity.setProperty("fooType", fooType.getName())
    }
    
    @PostLoad
    public postLoad(Entity entity){
       fooType = Class.forName(entity.getProperty("fooType"));
    }
    
  2. 序列化Class因为它实现Serializable了这是允许的)。这将使用 Java 序列化将字段保存为 Blob(最大 1Mb 大小)。这是一个简单的解决方案,但缺点是该属性没有被索引并且不能在查询中使用。

    @Serialize
    private Class<Foo> fooType;
    
于 2012-04-04T16:20:11.183 回答