App Engine 数据存储区是一个无架构对象数据存储区,具有查询引擎和原子事务。Java SDK 包括 Java 数据对象 (JDO) 和 Java 持久 API (JPA) 接口的实现,以及低级数据存储区 API。
Java 数据对象 (JDO) 是用于将包含数据的对象存储在数据库中的标准接口。该标准定义用于对 Java 对象进行批注、通过查询检索对象,以及使用事务与数据库交互的接口。使用 JDO 接口的应用程序可以在不使用任何数据库特定的代码的情况下使用不同类型的数据库,包括关系数据库、层次数据库和对象数据库。至于其他接口标准,JDO 使您的应用程序可轻松地在不同的存储解决方案之间移植。
要使用 JDO 访问数据存储区,App Engine 应用程序需进行以下设置:
war/WEB-INF/lib/
目录。jdoconfig.xml
的配置文件必须位于应用程序的 war/WEB-INF/classes/META-INF/
目录中,配置为使 JDO 使用 App Engine 数据存储区。
应用程序使用 PersistenceManager 类的实例和 JDO 交互。可通过实例化并调用 PersistenceManagerFactory 类的实例上的方法来获取此实例。工厂使用 JDO 配置来创建 PersistenceManager 实例。
由于 PersistenceManagerFactory 实例需要时间来初始化,因此应用程序应重复使用单个实例。为强制执行此操作,如果应用程序实例化一个以上 PersistenceManagerFactory(具有相同配置名称),将引发异常。管理 PersistenceManagerFactory 实例的一个简单方式是创建一个具有静态实例的单独包装器类,如下所示:
PMF.java
import javax.jdo.JDOHelper; import javax.jdo.PersistenceManagerFactory; public final class PMF { private static final PersistenceManagerFactory pmfInstance = JDOHelper.getPersistenceManagerFactory("transactions-optional"); private PMF() {} public static PersistenceManagerFactory get() { return pmfInstance; } }
应用程序使用工厂实例来为访问数据存储区的每一请求创建一个 PersistenceManager 实例。
import javax.jdo.JDOHelper; import javax.jdo.PersistenceManager; import javax.jdo.PersistenceManagerFactory; import PMF; // ... PersistenceManager pm = PMF.get().getPersistenceManager();
使用 PersistenceManager 来存储、更新和删除数据对象并执行数据存储区查询。
完成 PersistenceManager 实例时,您必须调用其 close()
方法。在调用实例的 close()
方法后使用 PersistenceManager 实例是错误的。
try { // ... do stuff with pm ... } finally { pm.close(); }
App Engine 实例不支持 JDO 接口的以下功能:
@PersistenceCapable
批注的 IdentityType.DATASTORE
。仅支持 IdentityType.APPLICATION
。
您可以使用 JDO 在数据存储区中存储普通 Java 数据对象(有时也称为“普通旧 Java 对象”或“POJO”)。每个通过 PersistenceManager 变为持久的对象都成为数据存储区中的一个实体。您可以使用批注告诉 JDO 如何存储和重新创建数据类的实例
JDO 保存的每个对象都将成为 App Engine 数据存储区中的实体。实体的类型从类的简单名称派生(内部类使用不带包名称的 $
路径)。类的每个持久字段代表实体的一个属性,其中属性的名称与字段的名称相同(保留大小写)。
要将 Java 类声明为能够通过 JDO 在数据存储区中存储或检索,请为该类指定 @PersistenceCapable
批注。
要存储到数据存储区中的数据类的字段必须声明为持久字段。要将字段声明为持久,请为其指定 @Persistent
批注:
要将字段声明为非持久(该字段不会存储到数据存储区中,也不会在检索对象时还原),请为其指定 @NotPersistent
批注。
字段的类型可以是以下任意一种。下文详细说明了这些类型。
java.util.List<...>
)或核心数据存储区类型的值的数组@PersistenceCapable
类的一个实例或实例集合数据类必须具有一个专用于存储相应数据存储区实体的主键的字段。您可以在 4 种不同类型的键字段中选择,每一种都使用不同的值类型和批注。(有关详细信息,请参阅创建数据:键。)最简单的键字段是在对象首次保存到数据存储区时,由 JDO 使用在类的所有其他实例中唯一的值自动填充的长整型值。长整型键使用 @PrimaryKey
批注,以及 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
批注
数据存储区支持以下核心值类型:
短文本字符串,< 500 字节 | java.lang.String |
Unicode | 超过 500 字节的值将引发 JDOFatalUserException。 |
短字节字符串,< 500 字节 |
|
字节顺序 | 超过 500 字节的值将引发 JDOFatalUserException。 |
布尔值 |
|
false <true |
|
整数 | 、
|
数字 | 作为长整型存储,然后转换为字段类型。超出范围的值将溢出。 |
浮点数字 |
|
数字 | 作为双精度浮点数存储,然后转换为字段类型。超出范围的值将溢出。 |
日期时间 | java.util.Date |
按时间顺序 | |
Google 帐户 |
|
按电子邮件地址 (Unicode) | |
长文本字符串 |
|
(不可排序) | 未编入索引。 |
长字节字符串 |
|
(不可排序) | 未编入索引。 |
实体键 |
,或引用的对象(作为子对象) |
按路径元素(类型、ID 或名称、类型、ID 或名称...) | |
网址 |
|
Unicode |