Loading [MathJax]/extensions/tex2jax.js

2011-06-25

Objectify-appengineでGAEデータストアを操作する

GWTプログラミングにおいては、GWT-RPCを利用することはしばしばあります。この場合、サーバークライアント間でのデータのやりとりは、
シリアライズ可能なPureなデータクラスを用意する
のが前提になります。ここで、データベースを絡めてくると厄介な問題がおきます。例えば、GAEのDatastoreを利用する場合、DatastoreとのやりとりはJPAやJDOのフレームワークを使いますが、この場合のEntityクラスには、それら特有の記述(アノテーション)が必要となります。このEntityクラスは、GWTで利用可能なシリアライズ化されず、GWT-RPCでは受けつけられません。よって、PureデータクラスをDTOとして中身の入れ替え作業が必要になります。その手間は面倒です。

objectify-appengineというライブラリ
この問題を解決する方法として、objectify-appengineと呼ばれるGAEのデータストアに対応したライブラリがあります。これを利用することで、GWTーRPCで利用したデータクラスをそのままデータストアに渡すことができます。本ラボでは現在まだ試行中ですが、JDOと同じような感覚で利用できるのがポイントです。

ライブラリの準備
まず、公式サイトからライブラリを入手して下さい。最近、3.0のバージョンが出たようです。3.0でどう変わったのかはちょっと不明です。ライブラリにパスを通したあと、GWTの設定ファイルに以下の記述を追記して下さい。
<inherits name="com.googlecode.objectify.Objectify" />
javax.persistanceのアノテーションを利用しますので、
ejb3-persistance.jar 
をクラスパスに記述してください。

Entityクラスの記述方法
下記に示すとおり、記述はシンプルになります。

  • idには@Idを追記
  • getter/setterはなくても良い(書いておいたほうがいいでしょう)
  • @Transient String doNotPersistがいるらしい(調査中、不要かも)

  1. import javax.persistence.Id;   
  2. import javax.persistence.Transient;  
  3.   
  4. public class Car  
  5. {  
  6.      @Id Long id;  
  7.     String vin;  
  8.     int color;  
  9.     @Transient String doNotPersist;  
  10.   
  11.     public Car() {}  
  12.       
  13.     public Car(String vin, int color)  
  14.     {  
  15.         this.vin = vin;  
  16.         this.color = color;  
  17.     }  
  18. }  

以下にとりあえず基本的な記述の仕方を載せます。

クラスの登録
ここはJDOなどとちょっと違うところです。ObjectifyはどのクラスがEntityクラスに相当するのか、コードで明示的に記述する必要があります。
  1. ObjectifyService.register(Car.class);//該当するクラスを登録  
  2. Objectify ofy = ObjectifyService.begin(); //サービスのインスタンスを生成  
データの追加・修正
  1. ofy.put(car);  
削除
  1. ofy.delete(car);  

検索
  1. //IDによる検索  
  2. Car fetched1 = ofy.get(new Key<car>(Car.class, porsche.id));  
  3. Car fetched2 = ofy.get(Car.class, porsche.id);   
  4.   
  5.   
  6. //クエリによる検索(結果が1つの場合)  
  7. Car car = ofy.query(Car.class).filter("vin""123456789").get();  
  8.   
  9. //クエリによる検索(結果が複数ある場合)  
  10. Query<car> q = ofy.query(Car.class).filter("vin >""123456789");  
  11. for (Car car: q) {  
  12.     System.out.println(car.toString());  
  13. }  
  14. </car></car>  
リファレンスをみてみるといろいろ強力な処理ができるようで、GAEのデータストアを利用する際のフレームワークの候補として挙げてみて良いと思います。

0 件のコメント:

コメントを投稿