每个实体都具有一个在 App Engine 的所有实体中唯一的键。一个完整的键包含若干条信息,其中包括应用程序 ID、类型和实体 ID。
如果类用作关系中的“子”类,则键字段必须为能够代表父实体组的类型:Key 实例或编码为字符串的键值。
如果应用程序创建一个新对象,并为其指定了与类型相同(且具有相同父实体组)的另一对象相同的字符串 ID,则保存该新对象时将覆盖数据存储区中的另一对象。要在创建新对象前检测字符串 ID 是否已经被使用,您可以使用事务尝试获取具有指定 ID 的实体,如果该实体不存在,则您可以继续创建。
主键字段有 4 种类型:
1. 长整型 (java.lang.Long
)
由数据存储区自动生成的实体 ID。
对于没有父实体组、其 ID 应由数据存储区自动生成的对象,请使用此类型。
实例的长整型键字段在该实例保存时填充。
使用方法:
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
2.未编码字符串(java.lang.String
)
一个字符串:对象创建时由应用程序提供的实体 ID(“键名”)。
对于没有父实体组、其 ID 应由应用程序提供的对象,请使用此类型。
应用程序在保存前将此域设置为所需的 ID。
使用方法:
@PrimaryKey
private String name;3.Key 实例(com.google.appengine.api.datastore.Key)
键值包括父实体组(如果有)的键以及应用程序分配的字符串 ID 或系统生成的数字 ID。要创建带应用程序分配的字符串 ID 的对象,请创建带有该 ID 的键值并将字段设置为该值。
要创建带系统分配的数字 ID 的对象,请将键字段留为 null。
使用方法:@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
public void setKey(Key key) {
this.key = key;
}//使用 KeyFactory 类创建 Key 实例
Key key = KeyFactory.createKey(Employee.class.getSimpleName(), "Alfred.Smith@example.com");Employee e = new Employee();
e.setKey(key);4.编码字符串形式的键
与键类似,但值是键的编码字符串形式。
编码字符串键允许您以便携方式编写应用程序且仍可以利用 App Engine 数据存储区实体组。
应用程序可以在保存前使用带名称的键填充该值,或将它留为 null。
如果编码的键字段为 null,则将在保存对象时使用系统生成的键填充该字段。
Key 实例和编码字符串表示可以通过 KeyFactory 方法
keyToString()
和stringToKey()
进行相互转换。
使用方法:
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")private String encodedKey;当使用编码键字符串时,您可以通过一个额外的字段提供对对象的字符串 ID 或数字 ID 的访问:
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String encodedKey;
@Extension(vendorName="datanucleus", key="gae.pk-name", value="true")
private String keyName;
// OR:
@Extension(vendorName="datanucleus", key="gae.pk-id", value="true")
private Long keyId;
"gae.pk-name"
字段可以在保存对象前设置为键名称。保存对象时,将使用包括键名称的完整键填充编码键字段。其类型必须为 String。
"gae.pk-id"
字段在对象保存时填充,且无法修改。其类型必须为 Long。