今後の為にここでいくつかメモっておこうかと思う。
1.GAEjからデータストアにアクセスする場合、次の2つ方式がある。
・JDO(Java Data Objects)
・JPA(Java Presistence API)
今回は、JDO(Java Data Objects)の方式で作成してみた。
■サーバー側プログラム
(1)データクラスを定義するクラス
[fileMaster.java]
@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
public class fileMaster {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String caption;
@Persistent
private String name;
@Persistent
private String deftag;
@Persistent
private Date date;
@Persistent
private String filename;
@Persistent
private String contentType;
@Persistent
private Blob binData;
・
・
省略(コンストラクター、セッターメソッド、ゲッターメソッドなど)
・
・
}
【説明】
・JDOで保存されたオブジェクトは、GAEデータストア内のエンティティになる。
データストアでのJavaクラスの永続化と参照等にJDOを使用できるようにするには、
クラスに@PersistenceCapableを付加する必要がある。
@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
は、データストアでのJavaクラスの格納と取得にJDOを使用できるようにするidentityType = IdentityType.APPLICATIONは、主キー(PrimaryKey)の定義を
アプリケーション側で行うという宣言で、GAEでは必ずこの宣言にする必要がある。
detachable="true"はエンティティを永続化後、transientな状態に戻ってしまうのを防ぐ。
・永続化対象プロパティ定義
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String caption;
@Persistent
private String name;
@Persistent
private String deftag;
@Persistent
private Date date;
@Persistent
private String filename;
@Persistent
private String contentType;
@Persistent
private Blob binData;
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)は、システムで生成されたKeyを
使用するための記述
(2)永続化処理を実行するクラスファイル
[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;
}
}
(3)永続化処理の基本パターン
// 永続化マネージャのインスタンス生成
PersistenceManager pm = PMF.get().getPersistenceManager();
// データクラスのインスタンス生成と値設定
fileMaster fmas = new fileMaster(key, caption, name, deftag, date,filename, contentType, b);
try {
//永続化の実行
pm.makePersistent(fmas);
} finally {
//永続化マネージャのクローズ
pm.close();
}
(4)永続化処理の基本パターン(サーブレットの一部)
boolean adddata = false;
String registerno = futil.getParameter("registerno");
Key key = KeyFactory.createKey(fileMaster.class.getSimpleName(),registerno);
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
fileMaster echeck = pm.getObjectById(fileMaster.class, key); // キーでオブジェクトを取得
} catch (JDOObjectNotFoundException e) {
adddata = true;
}
if (uniq) {
// データ登録を行う
String caption = futil.getParameter("caption");
String name = futil.getParameter("name");
String filename = futil.getParameter("filename");
String contentType = futil.getParameter("contentType");
String deftag = futil.getParameter("deftag");
Date date = new Date();
byte[] b = futil.getFileData();
fileMaster fmas = new fileMaster(key, caption, name, deftag, date,
filename, contentType,
auth.getAdmin_Email(),
"",
true, // User_r
true, // User_w
true, // User_x
false, // Group_r
false, // Group_w
false, // Group_x
false, // Other_r
false, // Other_w
false, // Other_x
b);
try {
pm.makePersistent(fmas);
// 登録成功処理記述
} catch (Exception e) {
// 登録失敗処理記述
} finally {
pm.close();
}
}
(5)永続化処理の基本パターン-削除(サーブレットの一部)
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");
resp.setCharacterEncoding("utf-8");
// ユーザチェック
・
・
省略
・
・
String registerno = req.getParameter("registerno");
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
Key key = KeyFactory.createKey(fileMaster.class.getSimpleName(), registerno);
fileMaster fmas = pm.getObjectById(fileMaster.class, key);
pm.deletePersistent(fmas);
resp.getWriter().println("削除成功 登録番号="+registerno);
}catch(JDOObjectNotFoundException e){
resp.getWriter().println("削除データなし エラー:"+e);
}catch (Exception e){
resp.getWriter().println("削除不成功 エラー:"+e);
} finally {
pm.close();
}
}
(6)トランザクション処理(いまのところどれくらいつかえるのか未検証)
・
・ 省略
・
Transaction tx = pm.currentTransaction();
try{
tx.begin();
pm.deletePersistent(fmas);
・
・ 省略
・
pm.makePersistent(fmas);
tx.commit();
・
・ 省略
・
}catch(Exception e){
// エラー処理
}
finally{
if(tx.isActive()){
tx.rollback();
}
pm.close();
}
・
・ 省略
・
0 件のコメント:
コメントを投稿