2009年6月27日土曜日

GAEで派生データを登録


すでにこの設定などは古くなっている可能性があります。

Slim3の開発はこんなブログより正式ドキュメントが有効です。
Slim3サイト
非公式と言われていますが充実した日本語サイトもあります。
Slim3日本語サイト



少し前に試した時にダメだったので諦めていたのですが、
再度チャレンジしたらOKだったので投稿しておきます。

親クラスを準備します。

package bz.ziro.slim3.test.model;

import java.io.Serializable;
import java.util.Date;
import java.util.logging.Logger;

import javax.jdo.JDOHelper;
import javax.jdo.annotations.Extension;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import javax.jdo.annotations.Version;
import javax.jdo.annotations.VersionStrategy;

import com.google.appengine.api.users.User;

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
@Version(strategy = VersionStrategy.VERSION_NUMBER)
public class Parent implements Serializable {

private static final long serialVersionUID = 1L;

@SuppressWarnings("unused")
private static final Logger logger = Logger.getLogger(Parent.class.getName());

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
private String key;


@Persistent
private User creator;
@Persistent
private Date createDate;
@Persistent
private User editor;
@Persistent
private Date editDate;

/**
* @return the key
*/
public String getKey() {
return key;
}

/**
* @param key
* the key to set
*/
public void setKey(String key) {
this.key = key;
}
public User getCreator() {
return creator;
}

public void setCreator(User creator) {
this.creator = creator;
}

public Date getCreateDate() {
return createDate;
}

public void setCreateDate(Date createDate) {
this.createDate = createDate;
}

public User getEditor() {
return editor;
}

public void setEditor(User editor) {
this.editor = editor;
}

public Date getEditDate() {
return editDate;
}

public void setEditDate(Date editDate) {
this.editDate = editDate;
}

/**
* @return the version
*/
public long getVersion() {
return (Long) JDOHelper.getVersion(this);
}
}



でこのクラスを派生した子クラスを準備します。


package bz.ziro.slim3.test.model;

import java.io.Serializable;
import java.util.logging.Logger;

import javax.jdo.JDOHelper;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.Version;
import javax.jdo.annotations.VersionStrategy;

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
@Version(strategy = VersionStrategy.VERSION_NUMBER)
public class Child extends Parent implements Serializable {

private static final long serialVersionUID = 1L;

@SuppressWarnings("unused")
private static final Logger logger = Logger.getLogger(Child.class.getName());

@Persistent
private String name;
@Persistent
private String detail;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
/**
* @param detail セットする detail
*/
public void setDetail(String detail) {
this.detail = detail;
}
/**
* @return detail
*/
public String getDetail() {
return detail;
}
/**
* @return the version
*/
public long getVersion() {
return (Long) JDOHelper.getVersion(this);
}
}



これで準備完了です。
ChildオブジェクトをGAE(JDO,BigTable)で登録すれば
Parentの属性も登録できます。


実装の通り、登録ユーザや登録日付などテーブル内にある同一の属性を
親クラスを利用することにより、はしょることができます。
まぁ私の場合は更新時などにオブジェクトに都度同一の実装が必要になり
困っていたので助かります。

JDOを知った時に論理モデル(つうかUML記述?)をそのまま使えるなぁ。。。
って思ってやったらダメだったんですけど、やっぱできるんですね。

ちなみにDataNucleusでJDBC(HSQLDB)で同じようにやると
Parentテーブルがにもデータがあって。。。って感じになった記憶があります。
※同一のエンティティではないです。


ちなみにSlim3のDaoでMetaクラスを利用して検索式を作成しても
ChildMetaに存在しないのでエラーになります。
問い合わせるかはもう少し試してからにしようと思ってます。

2009/07/08 ※再度試したらSlim3でも動作しました。
2009/07/26 ※再度試したらSlim3で動作。。。っていうかGAEで動作しませんでした。
ので、Embeddedの話で記述します。

0 件のコメント: