虽然其他答案可能是正确的,但我主要是在寻找一种方法来实现这一点,而无需使用外部库.
我在前面提到的EmbeddedEntity做了一些研究,发现这确实是我想要的.
我正在编写并接受这个答案,因为它为我的问题提供了一个精确的解决方案,而不仅仅是解决问题的指导方针.我希望通过这种方式指导未来遇到类似问题的人.
现在保存此人看起来像这样:
@Override
public boolean savePerson(Person p) {
if (p.getEntity() == null) {
return false;
}
p.getEntity().setProperty("name", p.getName());
p.getEntity().setProperty("token", p.getToken());
p.getEntity().setProperty("messages", p.getMessages());
p.getEntity().setProperty("completedTests", p.getCompletedTests());
EmbeddedEntity ee = new EmbeddedEntity();
Map testInformation = p.getTestInformation();
for (String key : testInformation.keySet()) { // TODO: maybe there is a more efficient way of solving this
ee.setProperty(key, testInformation.get(key));
}
p.getEntity().setProperty("testInformation", ee);
DatastoreServiceFactory.getDatastoreService().put(p.getEntity());
return true;
}
现在加载此人看起来像这样:
Person p = new Person(id);
p.setName((String) e.getProperty("name"));
p.setToken((String) e.getProperty("token"));
p.setMessages((List) e.getProperty("messages"));
p.setCompletedTests((List) e.getProperty("completedTests"));
Map ti = new HashMap<>();
EmbeddedEntity ee = (EmbeddedEntity) e.getProperty("testInformation");
if (ee != null) {
for (String key : ee.getProperties().keySet()) {
ti.put(key, (String) ee.getProperty(key));
}
p.setTestInformation(ti);
}
p.setEntity(e);