----------------------------------------------------------------------------
・環境
----------------------------------------------------------------------------
Google App Engine) 1.3.0
java) 1.6
slim3) 2009/12/25にアップされたもの
flex) 3.0.2
blazeds
Eclipse 3.4.2
----------------------------------------------------------------------------

単純な更新処理を作ってたら、com.google.appengine.api.datastore.KeyがうまくFlex⇒Javaに渡せない。というかすでにJava⇒Flexの時点で渡せてないっぽい。Flexでデバッグしてみると、keyはNULLではない。けどもなんか、、、変だ!

なんでだろう。ちょっと遠回りかもしれないけどAMFについて調べてみた。曰く、「自作クラスもシリアライズ・デシリアライズしてくれるAmazing/Marvelous/Funtastic(AMF(ちなみに嘘の略称))です」的なことが書いてあった。
*AMF = Action Message Format

シリアライズ・デシリアライズという大人な対応ができるAMF。社会人としては見習いたい。が、きっとこの大人な対応でKEYに関してはおかしなことになっているんではないだろうかと、尾崎豊ばりに大人へのアレルギー反応を示してみる。

で、どうすればいいんだろう ⇒ Key as Encoded Stringというのがあると知った。

(引用)----------------------------------------------------------------------
"このKey型のフィールドは、BlazeDSにてAMFのシリアライズを実施すると、キーの内容が失われてしまうのです。そこで筆者はさらに修正を加えて、Datastore APIのドキュメント上で「Key as Encoded String」と分類されている方法で主キーを実装しました。これは、上記のKeyオブジェクトの内容をString型にエンコードする方法で、主キーのフィールドには以下のようなアノテーションを追加します。"

ref. https://www.adobe.com/jp/devnet/flex/articles/google_app_eng_w_beazeds_p2.html
----------------------------------------------------------------------------

へー、と思って調べたらけっこう常套手段だったみたい。

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

ref. http://d.hatena.ne.jp/bluerabbit/20090608/1244465566
----------------------------------------------------------------------------

で、やってみたら、slim3に怒られた。slim3の便利アノテーション@Modelを使っているのだけれど、このアノテーションつけてると「@Attribute(primaryKey = true)」が必要になる。そしてこのアノテーションは「com.google.appengine.api.datastore.Key」にしかつけられない、、、orz

@Modelは便利だから使いたい!お風呂で考えた、、、あ、、、、そうだ、、、!(京都に行こう)

苦肉の策と呼ぶにふさわしい方法を思いついて、やってみた。したら更新できました。すんごいダメそうな方法です!恥ずかしい!

----------------------------------------------------------------------------
Java側のモデル
----------------------------------------------------------------------------
@Model
public class モデルクラス...

@Attribute(primaryKey = true)
private Key key;

@Attribute(persistent=false)
private String keyStr; // この段階で嫌な予感がしている人もいるのでは、、、

.
.
.

// 一応以下のようなコードにするとロジック面では特に意識することなく
// keyStrによるkeyの補完計画が遂行される、、、

/** getter */
public Key getKey() {

// keyがないのにkeyStrに値があるときは、keyStrの値をkeyに持たせる
// これでAMF越しにKeyが消える現象を力技でねじ伏せる、、、
if (key == null && keyStr != null){
key = KeyFactory.stringToKey(keyStr);
}

return key;
}

/** setter */
public void setKey(Key key) {
this.key = key;
// ついでにString型も保持しておく
this.keyStr = KeyFactory.keyToString(key);
}

----------------------------------------------------------------------------
Flex側のモデル
----------------------------------------------------------------------------
[RemoteClass(alias="パス.モデルのクラス")]
public class モデルクラス{

public var key : Object; //あっても取れないけど。

public var keyStr : String; // ここにkeyが退避されている形。
.
.
.
----------------------------------------------------------------------------
ref. keyToStringとstringToKeyのドキュメント
----------------------------------------------------------------------------

こ、こうすれば@Modelにも怒られないで、AMFの大人な対応もかいくぐることができた。

いや、きっとslim3には他のやり方があるのかも、、、でも自分の検索技術では見つけられなかった。ふつうにJDOでやるなら(それが一番かも)下記記事が有益そうでした。
http://secondarykey.blogspot.com/2009/06/gae.html