以前の記事(
「JavaのGoogle Cloudエンドポイント:ガイド。パート1 」 、
「JavaのGoogle Cloudエンドポイント:ガイド。パート2(フロントエンド) 」 、
「JavaのGoogle Cloudエンドポイント:ガイド。パート3」 )では、
Google Cloud EndpointsでのAPIの作成と、
AngularJSでのAPIのフロントエンドを分析しました。
ただし、APIの作成に関するガイダンスは、データベースを操作しないと不完全です。
この記事では、
GA EngineのApp Engine Datastoreデータベースを操作するための
Objectifyフレームワークについて説明し
ます 。
App Engineデータストア
App Engineデータストアは、Key-Valueデータベースタイプの非リレーショナルNoSQLデータベース(スキーマレスNoSQLデータストア)です。
キー
キーは、データベース内の「オブジェクト」(App Engineデータストアでは「エンティティ」と呼ばれる)の一意の識別子です。
キーは3つのコンポーネントで構成されています。
種類 (タイプ):データベース内のオブジェクトのタイプに対応します(Objectifyを使用してkindをJavaクラスとしてモデル化します。つまり、
相対的に言えば、この場合、kindはデータベース内にあるオブジェクトのクラスを意味します)
識別子 :オブジェクトの一意の識別子。文字列(String)の場合は
nameと呼ばれ、番号(Long)の場合は
Idと呼ばれます。 つまり タイプ
"01234"
の
01234
は
nameで 、タイプ
01234
の
01234
は
Idです。 識別子は、同じタイプのオブジェクト間で一意である必要があります。異なるタイプのオブジェクトは同じ識別子を持つことができます。 識別子「01」を持つタイプ「row」のオブジェクトと、識別子「01」を持つタイプ「column」のオブジェクトを持つことができます。 データベースに新しく作成されたオブジェクトについては、明示的に指定されていない場合、識別子が自動的に生成されます。
親 (オブジェクトのグループ):データベース内のオブジェクトを「オブジェクトのグループ」にまとめることができます。このため、「親」オブジェクトのキーを親で指定するか、グループに含まれないオブジェクトをnull(デフォルト)で指定します。
エンティティ
データベース内のオブジェクト(エンティティ)には、値(値型)を含むことができるプロパティがあります。Javaデータ型(Java型)への対応は、表に示されています。
データベース操作
Objectifyは3つの基本操作を実行します。
save() :データベースにオブジェクトを保存します
delete() :データベースからオブジェクトを削除します
load() :データベースからオブジェクトまたはオブジェクトのリスト(リスト)をロードします。
トランザクションとエンティティグループ
オブジェクトをグループにまとめるために、「親」オブジェクトはデータベースに存在する必要はなく、オブジェクトキーを指定するだけです。 「親」を削除しても、「子」は削除されず、引き続きそのキーを参照します。
このメカニズムを使用すると、データベース内のオブジェクトを階層構造の形式で編成できます。
「親オブジェクト」-「子オブジェクト」(親-子関係)の関係は、同じタイプのオブジェクト(たとえば、great祖父->祖父->父-> I->息子)と異なるタイプのオブジェクト(たとえば、タイプ「car」の子オブジェクトのオブジェクトは、タイプ「wheel」、「engine」のオブジェクトにすることができます)
この場合、各「子」オブジェクトは「親」オブジェクトを1つだけ持つことができます。 また、親オブジェクトのキーはオブジェクトのキーの一部であるため、オブジェクトの作成後に追加または削除することはできません-キーは変更されません。 したがって、「親キー」の使用には注意が必要です。
原則として、単一の
トランザクション内では、オブジェクトの1つのグループのみからデータにアクセスできます(ただし、1つのトランザクションで複数のグループを使用する方法があります)
グループ内のオブジェクトがグループに対して変更されると、タイムスタンプが変更されます。 タイムスタンプはグループ全体に設定され、グループ内のオブジェクトが変更されると更新されます。
トランザクションを作成すると、トランザクションの影響を受けるオブジェクトの各グループは、このトランザクションに参加しているとマークされます。 トランザクションがコミットされると、トランザクションに関係するグループのすべてのタイムスタンプがチェックされます。 タイムスタンプのいずれかが変更された場合(その時点で別のトランザクションがグループ内のオブジェクトを変更したため)、トランザクション全体がキャンセルされ、ConcurrentModificationExceptionがスローされます。 詳細については、
github.com / objectify / objectify / wiki / Concepts#optimistic-concurrencyを参照
してください。
Objectifyはこの種の例外を処理し、トランザクションを繰り返します。 したがって、トランザクションはべき
等でなければなりません。 トランザクションを何回でも繰り返し、同じ結果を得ることができる必要があります。
Objectifyのトランザクションの詳細については、
github.com /
objectify /
objectify /
wiki /
Transactionsをご覧ください。
Objectifyをプロジェクトに接続します
フレームワークを使用するには、objectify.jarと
guava.jarをプロジェクトに追加する必要があります。
Objectifyは
Mavenリポジトリにあり 、pom.xmlに追加するだけです。
<dependencies> <dependency> <groupId>com.googlecode.objectify</groupId> <artifactId>objectify</artifactId> <version>5.1.9</version> </dependency> </dependencies>
-objectify.jarおよびguava.jarがプロジェクトに追加されます。
Objectifyは、WEB-INF / web.xmlで記述する必要があるフィルターを使用します。
<filter> <filter-name>ObjectifyFilter</filter-name> <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class> </filter> <filter-mapping> <filter-name>ObjectifyFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
データベース内のエンティティ(Entity)をモデル化するUserDataクラスを作成しましょう。
package com.appspot.hello_habrahabr_api; import com.googlecode.objectify.annotation.Entity; import com.googlecode.objectify.annotation.Id; import com.googlecode.objectify.annotation.Index; import com.googlecode.objectify.annotation.Cache; import java.io.Serializable; @Entity
次に、データベース内のオブジェクトを記述するために作成されたクラスを登録するクラスを作成する必要があります。このクラスには、Objectifyサービスオブジェクト(Objectifyサービスオブジェクト)を発行するメソッドが含まれます。 OfyServiceと呼びましょう:
package com.appspot.hello_habrahabr_api; import com.googlecode.objectify.Objectify; import com.googlecode.objectify.ObjectifyFactory; import com.googlecode.objectify.ObjectifyService; public class OfyService {
ここでAPIを作成します(UserDataAPI.javaファイルを呼び出しましょう):
package com.appspot.hello_habrahabr_api; import com.google.api.server.spi.config.Api; import com.google.api.server.spi.config.ApiMethod; import com.google.api.server.spi.config.ApiMethod.HttpMethod; import com.google.api.server.spi.config.Named; import com.google.api.server.spi.response.NotFoundException; import com.google.api.server.spi.response.UnauthorizedException; import com.google.appengine.api.users.User; import com.googlecode.objectify.Key; import com.googlecode.objectify.Objectify; import java.io.Serializable; import java.util.List; import java.util.logging.Logger; @Api( name = "userDataAPI",
{project ID} .appspot.com / _ah / api / explorerで、Webインターフェースを使用してデータベースからオブジェクトを追加、削除、ロードすることでAPIをテストできます。

開発者の
console.developers.google.com/datastore/entities/queryの
コンソールで適切なプロジェクトを選択すると、オブジェクトの作成、削除、並べ替えなど、データベースを操作できるウェブインターフェースにアクセスできます。

参照:
Wikiのオブジェクト化JavaDocのオブジェクト化Java Datastore APIデータストアへのデータの保存 (Googleチュートリアル)
Google I / O 2011の作成者
Jeff Schnitzer (
@jeffschnitzer )によるフレームワークの簡単な紹介:
youtu.be/imiquTOLl64 ?t=3m40sUPD:
Javaを使用したGoogle Cloud Storage:クラウド内の画像とその他のファイル