在中,
当我这么做时:
ProjectData pd = new ProjectData();
pd.id = null; // let Objectify auto-generate the project id
pd.dateCreated = date;
datastore.put(pd); // put the project in the db so that it gets assigned an id当运行"datastore.put( pd )“时,数据库将自动为每个pd分配一个唯一的ID。但是,如果我添加父密钥字段:
ProjectData pd_new= new ProjectData();
pd_new.id = null; // let Objectify auto-generate the project id
pd_new.parentKey= new Key<OtherData>(OtherData.class, anotherId);
pd_new.dateCreated = date;
datastore.put(pd_new);即使id仍然是自动生成的,它也不再是唯一的。ids总是相同的。例如,数据库中有7个ProjectData,它们的I都是"5629499534213120“。
我的数据结构是
public class ProjectData {
@Id Long id;
@Parent Key<OtherData> parentKey;
long dataCreated;
} 我在这里做错什么了吗,这困扰了我好几天。
顺便说一下,我可以通过手动分配它们中的每一个来修复它。
pd_new.id = System.currentTimeMillis();但我不认为这是个合适的方法。
发布于 2014-05-12 14:39:54
要在Andrei的回答中添加更多的细节:
在AppEngine中,有5个部分组成了一个键,只有这5个部分一起保证了AppEngine中所有键的唯一性:
因此,不同类型的实体有可能具有相同的ID,而且,也有可能拥有相同类型的实体,但具有不同的祖先路径,具有相同的ID。由此产生的一个推论是,如果您有一个对象,但是更改了它的父对象,它就会创建一个全新的对象--它不会更新现有的对象。因此,在AppEngine中,如果实体有可能被重新亲生,就不应该将关系建模为父-子关系。
因此,如果您正在使用Objectify,我建议的一件事是只公开您的对象中的密钥(可能是web安全的字符串版本),而不是公开ID。另一个选项是使用字符串ID,但在保存之前使用UUID.randomUUID填充它。
发布于 2014-05-12 00:54:15
这是正确的行为。为什么你会感到烦恼?
为了从Datastore中get()一个实体,您需要创建它的键。为此,您需要一个父键和一个子实体ID。这使得这个键总是唯一的(父实体总是有不同的ID ),即使其他父实体的子实体具有相同的ID。
https://stackoverflow.com/questions/23599479
复制相似问题