`

gae 数据存储的 jpa 说明

阅读更多

将 JDO 与 App Engine 配合使用

Java 持久性 API (JPA) 是一个用于将包含数据的对象存储在关系数据库中的标准接口。该标准定义用于对 Java 对象进行批注、通过查询检索对象,并使用事务与数据库交互的接口。使用 JPA 接口的应用程序可以在不使用任何供应商特定的数据库代码的情况下使用不同的数据库。JPA 使您的应用程序可轻松地在不同的数据库供应商之间移植。

App Engine Java SDK 包括针对 App Engine 数据存储区的 JPA 1.0 的实现。该实现基于 DataNucleus 访问平台。由于 JPA 提供一个标准接口和关系数据库交互,而 App Engine 数据存储区并非一个关系数据库,因此存在 App Engine 实现不支持的 JPA 功能。在可能的情况下,我们已尽力呼吁注意这些功能。

有关 JPA 的详细信息,请参阅访问平台 1.1 文档。详细而言,请参阅 JPA 映射和 JPA API

设置 JPA

要使用 JPA 访问数据存储区,App Engine 应用程序需进行以下设置:

  • JPA 和数据存储区 JAR 必须位于应用程序的 war/WEB-INF/lib/ 目录。
  • 命名为 persistence.xml 的配置文件必须位于应用程序的 war/WEB-INF/classes/META-INF/ 目录中,配置为使 JPA 使用 App Engine 数据存储区。
  • 项目的构建过程必须对编译的数据类执行后编译“增强”步骤以使其与 JPA 实现相关联。

如果使用的是 Eclipse Google 插件,则第一项和第三项已为您处理。新项目向导将 JPA 和数据存储区 JAR 放置在正确的位置上,构建过程自动执行“增强”步骤。您仍必须手动创建 persistence.xml 并将其放置在 war/WEB-INF/classes/META-INF/ 中。很快将更新该插件,以便可以自动执行此操作。

如果使用 Apache Ant 构建项目,您可以使用 SDK 内含的 Ant 任务来执行增强步骤。您必须在设置项目时复制 JAR 并创建配置文件。有关 Ant 任务的详细信息,请参阅使用 Apache Ant

复制 JAR

JPA 和数据存储区 JAR 内含在 App Engine Java SDK 中。您可以在 appengine-java-sdk/lib/user/orm/ 目录中找到。

将 JAR 复制到您的应用程序的 war/WEB-INF/lib/ 目录中。

确保 appengine-api.jar 也在 war/WEB-INF/lib/ 目录中。(可能已在创建项目时进行过复制)App Engine DataNucleus 插件使用此 JAR 访问数据存储区。

创建 persistence.xml 文件

JPA 接口需要应用程序的 war/WEB-INF/classes/META-INF/ 目录中的命名为 persistence.xml 的配置文件。您可以直接在此位置上创建此文件,或者让您的构建过程从源目录复制此文件。

创建内容如下的文件:

<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">

    <persistence-unit name="transactions-optional">
        <provider>org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider</provider>
        <properties>
            <property name="datanucleus.NontransactionalRead" value="true"/>
            <property name="datanucleus.NontransactionalWrite" value="true"/>
            <property name="datanucleus.ConnectionURL" value="appengine"/>
        </properties>
    </persistence-unit>

</persistence>

增强数据类

JPA 的 DataNucleus 实现在构建过程中使用后编译“增强”步骤使数据类与 JPA 实现相关联。

如果使用的是 Apache Ant,则 SDK 包括一个 Ant 任务来执行此步骤。有关 Ant 任务的详细信息,请参阅使用 Apache Ant

您可通过命令行使用以下命令来对编译类执行增强步骤:

java -cp classpath org.datanucleus.enhancer.DataNucleusEnhancer class-files

classpath 必须包含来自 appengine-java-sdk/lib/tools/ 目录的 JAR datastore-core-*.jardatanucleus-enhancer-*.jarasm-*.jar 和 geronimo-jpa-*.jar(其中 * 是各 JAR 的相应版本号),以及所有数据类。

有关 DataNucleus 字节码增强器的详细信息,请参阅 DataNucleus 文档

获取 EntityManager 实例

应用程序使用 EntityManager 类的实例和 JPA 交互。可通过实例化并调用 EntityManagerFactory 类的实例上的方法来获取此实例。工厂使用 JPA 配置(由名称 "transactions-optional" 标识)来创建 EntityManager 实例。

由于 EntityManagerFactory 实例需要时间来初始化,因此应该尽可能重用单个实例。执行该操作的一个简单方式是创建一个具有静态实例的单独包装器类,如下所示:

EMF.java

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public final class EMF {
    private static final EntityManagerFactory emfInstance =
        Persistence.createEntityManagerFactory("transactions-optional");

    private EMF() {}

    public static EntityManagerFactory get() {
        return emfInstance;
    }
}

应用程序使用工厂实例来为访问数据存储区的每一请求创建一个 EntityManager 实例。

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

import EMF;

// ...
    EntityManager em = EMF.get().createEntityManager();

使用 EntityManager 来存储、更新和删除数据对象并执行数据存储区查询。

完成 EntityManager 实例时,您必须调用其 close() 方法。在调用实例的 close() 方法后使用 EntityManager 实例是错误的。

    try {
        // ... do stuff with em ...
    } finally {
        em.close();
    }

类和字段批注

JPA 保存的每一对象都成为 App Engine 数据存储区中的实体。实体的类型从类的简单名称派生(无包名)。类的每个持久字段代表实体的一个属性,其中属性的名称与字段的名称相同(保留大小写)。

要将 Java 类声明为能够通过 JPA 存储到数据存储区或从数据存储区检索,请为该类指定 @Entity 批注。例如:

import javax.persistence.Entity;

@Entity
public class Employee {
    // ...
}

数据类要存储在数据存储区中的字段必须具有默认为持久的类型或显式声明为持久的类型。您可以在 DataNucleus 网站上找到详述 JPA 默认持久性行为的图表。要显式声明某一字段为持久,通常您将为其提供一个 @Basic 批注,但是目前有阻止这起作用的错误。因此,作为解决办法,您可以使用 @Enumerated 批注。

import java.util.Date;
import javax.persistence.Enumerated;

import com.google.appengine.api.datastore.ShortBlob;

// ...
    @Enumerated
    private ShortBlob data;

字段的类型可以是以下任一类型:

  • 数据存储区支持的核心类型中的一种
  • 核心数据存储区类型的值的 Collection(例如 java.util.List<...>
  • @Entity 类的一个实例或实例集合
  • 一个嵌入类,作为实体上的属性存储

数据类必须具有 public 或 protected 的默认构造函数,以及一个专用于存储对应数据存储区实体的主键的字段。您可以在 4 种不同类型的键字段中选择,每一种都使用不同的值类型和批注。(有关详细信息,请参阅创建数据:键。)最简单的键字段是在对象首次保存到数据存储区时,由 JPA 使用在类的所有其他实例中唯一的值自动填充的长整型值。长整型键使用 @Id 批注,以及@GeneratedValue(strategy = GenerationType.IDENTITY) 批注:

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

// ...
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

以下是一个示例数据类:

import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String firstName;

    private String lastName;

    private Date hireDate;

    // Accessors for the fields.  JPA doesn't use these, but your application does.

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    } 
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    } 

    public String getLastName() {
        return lastName;
    } 
    public void setLastName(String lastName) {
        this.lastName = lastName;
    } 

    public String getHireDate() {
        return hireDate;
    } 
    public void setHireDate(Date hireDate) {
        this.hireDate = hireDate;
    } 
}

不支持的 JPA 功能

App Engine 实例不支持 JPA 接口的以下功能:

  • 有主的多对多关系,以及无主的关系。虽然 API 中不强制类型检查,但您可以使用显式 Key 值实现无主的关系。
  • “Join”查询。当对父类型执行查询时,不可在过滤条件中使用子实体的字段。请注意,您可以用键直接在查询中测试父实体的关系字段。
  • 聚合查询(group by、having、sum、avg、max、min)
  • 多态查询。您不可执行某一类的查询以获取子类的实例。各类都由数据存储区中的单独实体类型表示。

分享到:
评论

相关推荐

    spring3+springmvc+jpa2+gae

    GAE有一些特定的限制,比如不能直接访问数据库,而是通过其Datastore服务,这是一个NoSQL的数据存储系统。 **集成关键点** 1. **依赖注入**:Spring 3的DI特性可以帮助管理GAE中的对象生命周期,例如,通过配置文件...

    spring+gae

    2. **数据存储**:Spring与GAE的数据存储API(如JDO或JPA)结合,可以提供一个统一的数据访问层,简化对Google Datastore的操作。 3. **调度任务**:Spring的TaskExecution和TaskScheduler模块可以与GAE的后台任务...

    spring+gae+hibernate

    Hibernate作为ORM工具,可以将Java对象与GAE的数据存储服务(如Datastore)进行对接,简化数据库操作。GAE则为这个应用提供了弹性云环境,自动处理负载和扩展需求。 在实际的集成过程中,可能涉及到以下步骤: 1. ...

    gea 整合struts2+jpa+spring实例

    2. **整合JPA**:GAE支持JPA通过App Engine Datastore进行数据存储。我们需要在`appengine-web.xml`配置文件中启用JPA,并在`persistence.xml`中配置实体管理工厂。接着,定义实体类,使用JPA注解如`@Entity`、`@Id`...

    gae-datastore-migrator:用于将 Google App Engine 数据存储实体导出到 CSV 文件以及使用 Java Persistence API 参考模型导入它们的实用程序类

    设计的工具,它的主要功能是帮助用户将 GAE 的数据存储(Datastore)中的实体转换为 CSV 文件格式,同时也支持从这些 CSV 文件中重新导入数据到 Datastore,使用 Java Persistence API (JPA) 的参考模型进行操作。...

    NoEnemyLG:使用 GAE 的 Android 后端客户端

    【描述】"NoEnemyLG_Android 使用 GAE 的 Android 后端客户端" 暗示项目是为名为 NoEnemyLG 的 Android 应用程序设计的,这个应用可能是一个游戏或具有特定功能的服务,其后端逻辑和数据存储在 GAE 上。这意味着 ...

    springongae

    需要注意的是,由于GAE的运行环境有其特殊性,如不支持JDBC驱动直接连接数据库,因此在数据存储方面通常会使用Google Cloud Datastore或其他云数据库。此外,GAE的内存和CPU资源有限制,可能需要优化Spring应用以...

    GAE:使用Google App Engine(GAE)的项目-Java和Spring

    5. **GAE的数据存储**:GAE提供了NoSQL的Datastore服务,可以替代传统的关系数据库。开发者需要理解其数据模型和查询方式,以适应非关系型数据库的特点。 6. **GAE的自动扩展**:GAE能够根据应用的负载自动扩展实例...

    云端代码:利用Google.AppEngine编程.源代码

    Java环境下,可以通过JDO或JPA来操作数据存储,同样也有类似的任务队列和HTTP服务。 2. **数据存储:Datastore** GAE的数据存储系统叫做Datastore,一个分布式、非关系型数据库。它支持强一致性读取和最终一致性...

    sm-gae-spring

    AppEngine 更好地支持 Maven AppEngine 插件和 JDO 数据存储 API。 设置和使用 Maven + JDO 通常比让 JPA + Spring 在 AppEngine 上正常工作要容易得多。 但是,您学习的 Spring Data API 可以通过正确的配置使用 ...

    GAESpringSecurityJPA:用于 Google App Engine 的基于 Spring、Spring Security、JPA 的模板

    开发者可以在 GAE 上免费或付费使用 Google 的基础设施,包括计算、存储和数据库服务。GAE 支持多种语言,包括 Java,这使得 GAESpringSecurityJPA 项目可以直接在 GAE 上运行,享受云服务带来的高可用性和可扩展性...

    gae-flightlog

    Java在App Engine上的应用通常使用Servlet和JSP(JavaServer Pages)技术来处理HTTP请求,构建后端逻辑,并使用JDO(Java Data Objects)或JPA(Java Persistence API)来与数据存储系统交互。 在【gae-flightlog-...

    josimpleacc:使用 GAE 的简单库存和卖家系统

    在Java开发中,可能使用了如Servlets、JSP(JavaServer Pages)等技术来构建动态Web页面,以及JDO(Java Data Objects)或JPA(Java Persistence API)进行数据持久化,与GAE的数据存储服务(如Datastore)交互。...

    gae-attendance-api:Restful + Scalable出勤跟踪API

    对于高并发场景,GAE提供了数据存储服务,如Datastore,它是一种NoSQL数据库,能自动处理分布式数据存储和扩展性问题。 此外,项目可能还涉及身份验证和授权机制,如OAuth2或JWT(JSON Web Tokens),确保只有经过...

    初用Google App Engine for Java (org.apache.jasper.JasperExceptio; org.datanucleun)

    例如,GAE的数据存储服务不支持关系数据库的SQL查询,而是采用NoSQL风格的API。因此,开发者需要理解DataNucleus在GAE环境下的配置和使用方法,包括实体类的注解、持久化策略以及事务管理。 在尝试部署到GAE时,...

    appengine-java-sdk-1.9.24

    它提供了动态扩展性,能够根据应用程序的需求自动调整资源,同时还提供了一系列云服务,如数据存储、身份验证、任务队列和邮件服务等。GAE 的一个重要特点是其“无服务器”架构,开发者只需关心应用程序的代码,而...

    guiatransmetro-gae:用于 GuiaTransmetro 的 Google AppEngine 后端 Java 应用程序

    4. **数据存储**:在AppEngine上,数据通常存储在Google Cloud Datastore中,这是一个NoSQL数据库,支持灵活的数据模型和高可用性。开发者可以使用GAE的JDO(Java Data Objects)或JPA(Java Persistence API)来...

    云计算课件

    - **分布式存储系统 Megastore**: 提供高效、可靠的数据存储服务。 - **大规模分布式系统的监控基础架构 Dapper**: 用于监控分布式系统的性能和行为。 - **Google应用程序引擎 (GAE)**: 提供了一个可扩展的Web...

    Google app engine plugins Eclipse Google 插件 3.3

    4. **数据存储**:GAE 提供了 NoSQL 数据存储服务,称为 Datastore。通过插件,你可以方便地创建实体模型,管理数据,并使用 JDO(Java Data Objects)或 JPA(Java Persistence API)进行数据操作。 5. **任务调度...

    Programming Google App Engine with Java-2015年英文原版,0积分

    - **Cloud Datastore**: 使用可扩展的Cloud Datastore进行数据存储,涵盖查询、事务处理以及使用Java Persistence API (JPA)进行数据建模等内容。 - **Cloud SQL**: 介绍如何利用Cloud SQL来为App Engine应用程序...

Global site tag (gtag.js) - Google Analytics