在物化中坚持阶级文学

时间:2012-04-04 15:44:01

标签: java google-app-engine objectify

如果我有一个带有类字面值的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

2 个答案:

答案 0 :(得分:3)

默认情况下,没有。但是,您可以相当轻松地添加一个转换器,该转换器将Class作为String本地存储在数据存储区中。您在save上使用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

请注意,如果类型与Converter无关,则在各个转换器中返回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

答案 1 :(得分:1)

Objectify只能坚持types supported by the GAE Datastore。 Java类型Class不是其中之一。

此外,由于type erasure,字段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. Serialize Class(因为它实现Serializable这是允许的)。这将使用Java序列化将字段持久化为Blob(最大1Mb大小)。这是一个简单的解决方案,但缺点是该属性未编入索引,无法在查询中使用。

    @Serialize
    private Class<Foo> fooType;
    
相关问题