ホーム > Google App Engine, slim3 > slim3での1対多関連での参照整合性

slim3での1対多関連での参照整合性

2010 年 7 月 29 日 tdtsh

slim3での1対多関連(片方向でも双方向でもどっちも)での参照整合性の話です。

親モデルが削除された時 Datastore#deleteで親モデルを削除した場合、子モデルにセットされている関連(ModelRef< 親モデル>)は消えない様です。(2010/07/30修正)

RDBMSのいわゆる参照整合性制約での ON DELETE NO ACTION に相当する仕様みたい。

ON DELETE CASCADEとか、ON DELETE SET NULLとか、SET DEFAULT とかは出来ないようです。
ON DELETE CASCADEにしたい場合は、Datastore#deleteAllで親モデルを削除すると、子孫モデルは連鎖削除されるようです※。
※ひがやすをさん、コメント有難う御座いました。

制約が必要ならアプリケーション側での実装することになります。
残念。
あんまりメンドクサイようならがんばってissueを投げてみよう。

参照整合性は連鎖削除のみサポートされていて、ON DELETE SET NULLとかSET DEFAULT は出来ないようです。多分。
コンシューマ向けのWEBサービスの場合は通常はコレで十分でしょう。
(2010/07/30修正)

※後で確認しましたが、参照整合性の連鎖削除(deleteAllで子孫モデルも削除)
を実現するには、親と子孫エンティティを同じEntityGroupにする必要がある様です。
つまり、slim3の機能としての「リレーション」だけではやはりダメで、
EntityGroupを併用する必要があるようです。
(2010/07/30追記)

でも、RDBMS側の制約に頼ったDAOのコードを書いて仕様書やDBのスキーマを見ないとビジネスルールが判んなくなる、といった事が起こりえないというメリットはありますね。

兎に角スキーマレスは素敵。一貫性の維持とかが自己責任になり大変だったとしても。

で、親モデルを削除した後、子モデルのModelRefでgetModel()しようとすると、
org.slim3.datastore.EntityNotFoundRuntimeException
がスローされます。

こうなった時とかには、ModelRefを削除します。

削除する方法ですが、ドキュメントに明示していませんでした。
試しに ModelRefでsetModel(null) した後にDatastoreにput したら、削除された様に見えます。

その後、Slim3のJavaDocでorg.slim3.datastore.ModelRefのんを見た所、clear()メソッドありました。

ModelRefでclear() してputしても削除された様に見えます。

どっちの作法が正しいんでしょうね。
取りあえず後者を使うことにします。

カテゴリー: Google App Engine, slim3 タグ:
  1. ひがやすを
    2010 年 7 月 30 日 08:05 | #1

    親をDatastore.deleteAll()で消すと子もみんな消えますよ。

  2. tdtsh
    2010 年 7 月 30 日 10:28 | #2

    有難う御座います。
    まさかご本人にご教示頂けるとは、恐縮です。
    slim3本、予約しました。

コメントは受け付けていません。