首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(Java)数据库自动生成ID

(Java)数据库自动生成ID
EN

Stack Overflow用户
提问于 2014-05-12 00:38:24
回答 2查看 1.4K关注 0票数 2

在中,

当我这么做时:

代码语言:javascript
复制
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。但是,如果我添加父密钥字段:

代码语言:javascript
复制
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“。

我的数据结构是

代码语言:javascript
复制
public class ProjectData {
  @Id Long id;
  @Parent Key<OtherData> parentKey;
  long dataCreated; 
}  

我在这里做错什么了吗,这困扰了我好几天。

顺便说一下,我可以通过手动分配它们中的每一个来修复它。

代码语言:javascript
复制
pd_new.id = System.currentTimeMillis();

但我不认为这是个合适的方法。

EN

回答 2

Stack Overflow用户

发布于 2014-05-12 14:39:54

要在Andrei的回答中添加更多的细节:

在AppEngine中,有5个部分组成了一个键,只有这5个部分一起保证了AppEngine中所有键的唯一性:

  1. 你应用程序的ID。
  2. 名称空间,用于多租户应用程序。
  3. 实体类型名称。
  4. 完整的祖先之路。
  5. 这个实体的ID。

因此,不同类型的实体有可能具有相同的ID,而且,也有可能拥有相同类型的实体,但具有不同的祖先路径,具有相同的ID。由此产生的一个推论是,如果您有一个对象,但是更改了它的父对象,它就会创建一个全新的对象--它不会更新现有的对象。因此,在AppEngine中,如果实体有可能被重新亲生,就不应该将关系建模为父-子关系。

因此,如果您正在使用Objectify,我建议的一件事是只公开您的对象中的密钥(可能是web安全的字符串版本),而不是公开ID。另一个选项是使用字符串ID,但在保存之前使用UUID.randomUUID填充它。

票数 3
EN

Stack Overflow用户

发布于 2014-05-12 00:54:15

这是正确的行为。为什么你会感到烦恼?

为了从Datastore中get()一个实体,您需要创建它的键。为此,您需要一个父键和一个子实体ID。这使得这个键总是唯一的(父实体总是有不同的ID ),即使其他父实体的子实体具有相同的ID。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23599479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档