我在GoogleAppEngine托管的应用程序中使用Objectify作为数据访问层。
当我试图持久化地图时,问题就来了。我的豆子看起来像这样:
@Entity
@Cached
class MyBean{
@Id
private Long id;
@Embedded
Map<String, String> parameters = new HashMap<String, String>();
public MyBean(){}
//getters and setters below
}
首先要注意的是,映射"parameters"不是私有的,它引发了JRE异常。保存地图时一切顺利。当从DataStore中检索它时,它会失败。
我的解决方法是使用@Serialized注释。这只是一个变通方法,因为我想要实现的是使用GAE数据存储的expando功能。
根据物化医生的说法,我做的是正确的操作。
异常详细信息:
由处的java.lang.NullPointerException引起com.googlecode.objectify.impl.Transmog.loadSingleValue(Transmog.java:364)在com.googlecode.objectify.impl.load.EmbeddedMapSetter.safeSet(EmbeddeMapSetter.java:65)在com.googlecode.objectify.impl.load.CCollisionDetectionSetter.set(CollisionDetectingSetter.java:37)在com.googlecode.objectify.impl.Transmog.loadSingleValue(Transmog.java:359)网址:com.googlecode.objectify.impl.Transmog.load(Transmog.java:340)com.googlecode.objectify.impl.ConcreteEntityMetadata.toObject(ConcreteEntityMetadata.java:203)在com.googlecode.objectify.impl.QueryImpl$ToObjectIterator.translate(QueryImpl.java:668)在com.googlecode.objectify.impl.QueryImpl$ToObjectIterator.translate(QueryImpl.java:657)在com.googlecode.objectify.util.TranslationIterator.next(TranslationIterater.java:35)
Objectify3中对嵌入式映射的支持很差,不应该公开发布。关于@Embedded Map的部分已从Objectify3文档中删除。
Objectify4广泛支持地图,包括这些expando风格的地图:
- 贴图(或任何基本体)
- 地图(主要参考资料)
- 映射(嵌入式类
此外,还有一个@Mapify注释,可以让你获取一个普通的对象集合,选择一个属性作为键,并将其存储为Map。
不幸的是,Objectify4的文档目前还没有准备好。然而,该源代码正被多个方面积极使用。如果你觉得大胆,就从树干开始建造。
我还建议使用Objectify 4-我已经升级了我的应用程序,发现它很容易做到。我特别喜欢对Map类型字段的支持。
为了回答这个问题,您永远不应该将@Embedded
放在只包含基元的数组中。因此,您不需要在地图上指定@Embedded
,因为String是Google应用程序引擎数据存储中的基元。