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しても削除された様に見えます。
どっちの作法が正しいんでしょうね。
取りあえず後者を使うことにします。