データストアとオブジェクト検索 (1/7)
作成:2010-05-03 14:05
更新:2010-05-10 17:08
更新:2010-05-10 17:08
■データストアとJDO
GAE/Jを利用するとき、その使い方を調べ始めて最初に驚くのが「リレーショナルデータベースがない」ということでしょう。さよう、GAE/Jにはリレーショナルデータベースはありません。SQLも使えません。この種のデータベースプログラムを設置することもできません。
といって、データベース機能がないわけでも、もちろんありません。Googleには「BigTable」と呼ばれる超巨大データベースがあります。この機能をGAE/Jから利用することができるようになっています。これが「データストア」と呼ばれるものです。ただし、このデータストアによるデータベース機能は、「リレーショナルデータベースではない」のです。
一般に、Webで多用されるSQL利用のデータベースは、データを「テーブル」の形で管理します。あらかじめデータの構造(どのような列があるか、ということ)をテーブルとして定義し、それにそって定義されたデータを追加していきます。が、データストアはこれとはかなり違います。
データストアは、いわば「シリアライズされたデータの保存場所」のようなものです。データストアに保管されるのは「オブジェクト」です。データストアの中にさまざまなオブジェクトを保管しておき、必要に応じてそれを取り出し利用するのです。
SQLのようなデータベースではなく、「オブジェクトの保管」という形になっていますから、データアクセスも通常のデータベースとはかなり異なります。データを保管するのは「オブジェクトを永続化する」ということですし、データの取得も「必要なオブジェクトを取り出す」という形になります。従って、一般的なデータベースアクセスの機能などではなく、「オブジェクトの永続化」を扱うための機能を利用することになります。
GAE/Jでは、「JDO(Java Data Objects)」と「JPA(Java Persistence API)」という、2種類のオブジェクト永続化技術をサポートしています。どちらを使ってもデータストアにアクセスすることは可能ですが、GoogleのGAEドキュメントなどはJDOベースで説明をしており、どうも「どっちでもいいけど、まぁ普通はJDOを使うんじゃない?」という感じがします。ですので、ここでもJDOベースに話を進めましょう。
JDOは、Javaオブジェクトの永続化のためのライブラリです。現在、Java EEの機能として提供されています。GAE/Jのための専用機能ではなく、サーバーサイドJavaをかじった人なら多少は馴染みのあるライブラリでしょう。このJDOを利用して、そのままデータストアにアクセスできるのです。
では、実際に簡単な例を作成しながら説明をしていきましょう。ここでは、ブックマーク情報を管理する「LinkData」というクラスを用意し、このインスタンスをデータストアに保管して利用してみることにしましょう。
まずは、データを管理する「LinkData」クラスを作成しましょう。以下にソースコードを掲載します。ここでは、jp.tuyanoパッケージに保管しておくようにしました。JDOで利用可能なオブジェクトは、ごく一般的なPOJOでよいのですが、しかし保持される値すべてが「シリアライズ可能」でなければいけません。また、一般的なデータベースにおけるプライマリキーなどの情報も用意されている必要があります。
そこで、JDOで保管するオブジェクトのクラスに、いくつかのアノテーションを追記することで、そのクラスの内容を他のクラスに知らせることができるようにしてあります。ここでは以下のようなアノテーションが使われていますね。
@PersistenceCapable――このクラスがシリアライズ可能であることを示すものです。これは()内に「identityType」という項目を持っています。
@PrimaryKey――そのフィールドがプライマリキーであることを示すものです。
@Persistent――そのフィールドがシリアライズ可能であることを示すものです。
ここでは、id, title, url, commentといったprivateフィールドを用意し、そのアクセサメソッドとコンストラクタを用意しました。アノテーションは見慣れないでしょうが、基本的にクラスそのものは非常にシンプルであることがわかるでしょう。
といって、データベース機能がないわけでも、もちろんありません。Googleには「BigTable」と呼ばれる超巨大データベースがあります。この機能をGAE/Jから利用することができるようになっています。これが「データストア」と呼ばれるものです。ただし、このデータストアによるデータベース機能は、「リレーショナルデータベースではない」のです。
一般に、Webで多用されるSQL利用のデータベースは、データを「テーブル」の形で管理します。あらかじめデータの構造(どのような列があるか、ということ)をテーブルとして定義し、それにそって定義されたデータを追加していきます。が、データストアはこれとはかなり違います。
データストアは、いわば「シリアライズされたデータの保存場所」のようなものです。データストアに保管されるのは「オブジェクト」です。データストアの中にさまざまなオブジェクトを保管しておき、必要に応じてそれを取り出し利用するのです。
SQLのようなデータベースではなく、「オブジェクトの保管」という形になっていますから、データアクセスも通常のデータベースとはかなり異なります。データを保管するのは「オブジェクトを永続化する」ということですし、データの取得も「必要なオブジェクトを取り出す」という形になります。従って、一般的なデータベースアクセスの機能などではなく、「オブジェクトの永続化」を扱うための機能を利用することになります。
GAE/Jでは、「JDO(Java Data Objects)」と「JPA(Java Persistence API)」という、2種類のオブジェクト永続化技術をサポートしています。どちらを使ってもデータストアにアクセスすることは可能ですが、GoogleのGAEドキュメントなどはJDOベースで説明をしており、どうも「どっちでもいいけど、まぁ普通はJDOを使うんじゃない?」という感じがします。ですので、ここでもJDOベースに話を進めましょう。
JDOは、Javaオブジェクトの永続化のためのライブラリです。現在、Java EEの機能として提供されています。GAE/Jのための専用機能ではなく、サーバーサイドJavaをかじった人なら多少は馴染みのあるライブラリでしょう。このJDOを利用して、そのままデータストアにアクセスできるのです。
では、実際に簡単な例を作成しながら説明をしていきましょう。ここでは、ブックマーク情報を管理する「LinkData」というクラスを用意し、このインスタンスをデータストアに保管して利用してみることにしましょう。
まずは、データを管理する「LinkData」クラスを作成しましょう。以下にソースコードを掲載します。ここでは、jp.tuyanoパッケージに保管しておくようにしました。JDOで利用可能なオブジェクトは、ごく一般的なPOJOでよいのですが、しかし保持される値すべてが「シリアライズ可能」でなければいけません。また、一般的なデータベースにおけるプライマリキーなどの情報も用意されている必要があります。
そこで、JDOで保管するオブジェクトのクラスに、いくつかのアノテーションを追記することで、そのクラスの内容を他のクラスに知らせることができるようにしてあります。ここでは以下のようなアノテーションが使われていますね。
@PersistenceCapable――このクラスがシリアライズ可能であることを示すものです。これは()内に「identityType」という項目を持っています。
@PrimaryKey――そのフィールドがプライマリキーであることを示すものです。
@Persistent――そのフィールドがシリアライズ可能であることを示すものです。
ここでは、id, title, url, commentといったprivateフィールドを用意し、そのアクセサメソッドとコンストラクタを用意しました。アノテーションは見慣れないでしょうが、基本的にクラスそのものは非常にシンプルであることがわかるでしょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
package jp.tuyano; import java.net.URL; import java.util.Date; import javax.jdo.annotations.*; @PersistenceCapable(identityType = IdentityType.APPLICATION) public class LinkData { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id; @Persistent private String title; @Persistent private String url; @Persistent private String comment; @Persistent private Date datetime; public LinkData(String title, String url, String comment, Date datetime) { super(); this.title = title; this.url = url; this.comment = comment; this.datetime = datetime; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment; } public Date getDatetime() { return datetime; } public void setDatetime(Date datetime) { this.datetime = datetime; } }
※関連コンテンツ
「Google App Engine for Java(GAE/J)プログラミング入門」に戻る