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しても削除された様に見えます。

どっちの作法が正しいんでしょうね。

取りあえず後者を使うことにします。