如果我有一个带有类字面值的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
答案 0 :(得分:3)
默认情况下,没有。但是,您可以相当轻松地添加一个转换器,该转换器将Class作为String本地存储在数据存储区中。您在save上使用Class.getName(),在加载时使用Class.forName()。
以下是Objectify3中的一个例子:
请注意,如果类型与Converter无关,则在各个转换器中返回null。如何启用它在这里描述:
这是Objectify4中的等价物:
如何启用它:
答案 1 :(得分:1)
Objectify只能坚持types supported by the GAE Datastore。 Java类型Class
不是其中之一。
此外,由于type erasure,字段fooType
不包含通用参数信息。
现在,有几种方法可以存储Class
类型:
只存储该类的长名称,通过@ 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"));
}
Serialize Class
(因为它实现Serializable
这是允许的)。这将使用Java序列化将字段持久化为Blob(最大1Mb大小)。这是一个简单的解决方案,但缺点是该属性未编入索引,无法在查询中使用。
@Serialize
private Class<Foo> fooType;