如何将HashMap(作为对象属性)保存到数据存储区

Bas*_*wub 4 java google-app-engine google-cloud-datastore

我正在使用GAE(Google App Engine)数据存储来存储人员.

每个人都有一个名字,一个唯一的标记,他们收到的消息列表(字符串)和他们完成的测试列表(字符串).这些都是支持的类型.

但是,我还想存储一个包含String键和String值的HashMap,以及有关它们已完成的测试的信息.

我正在尝试保存的示例Map(请注意,这是示例数据,而不是实际数据)

[
    <'test_easy_1', 'completed in 3 minutes'>
    <'test_easy_2', 'completed in 5 minutes'>
    <'test_hard_1', 'completed in 15 minutes'>
    <'test_hard_2', 'completed in 3 minutes.. Did you cheat?'>
]
Run Code Online (Sandbox Code Playgroud)

我想拯救这样的人

@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());
    p.getEntity().setProperty("testInformation", p.getTestInformation()); // does not work
    DatastoreServiceFactory.getDatastoreService().put(p.getEntity());

    return true;
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题:

如何将HashMaps作为对象属性保存到数据存储区?

我希望以一种方式执行此操作,我不必为HashMap创建整个类和新的数据存储区索引.但是,如果这是唯一的方法,我想知道如何这样做.谷歌搜索这并没有产生明确和明显的方式来处理这种情况.

Bas*_*wub 6

虽然其他答案可能是正确的,但我主要是在寻找一种方法来实现这一目标而不使用外部库.

我已经对前面提到的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<String, String> 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;
}
Run Code Online (Sandbox Code Playgroud)

现在加载此人看起来像这样:

Person p = new Person(id);
p.setName((String) e.getProperty("name"));
p.setToken((String) e.getProperty("token"));
p.setMessages((List<String>) e.getProperty("messages"));
p.setCompletedTests((List<String>) e.getProperty("completedTests"));

Map<String, String> 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);
Run Code Online (Sandbox Code Playgroud)