0

私はいくつかの作業コードを持っていますが、GORM とカスケード保存については少し曖昧です。ここに私のオブジェクトモデルがあります:

class Profile {
   PhotoAlbum photoAlbum

   static constraints = {
       photoAlbum(nullable:true)
   }
}

class PhotoAlbum {
   static hasMany = [photos:Photo]
   static belongsTo = [profile:Profile]
}

class Photo {
    static belongsTo = PhotoAlbum
}

そして、ここに新しい写真オブジェクトを保存するための私の作業コードがあります:

Photo photo = new Photo()

if (!profile.photoAlbum) { profile.photoAlbum = new PhotoAlbum(profile:profile) }

profile.photoAlbum.addToPhotos(photo)


if (!photo.save()) {
   def json = [
           status:'fail',
           message:messageSource.getMessage('label.photo.validate.failed.message', [photo.errorStrings].toArray(), LocaleContextHolder.locale)
   ]
   return json
}
if (!profile.photoAlbum.save()) {
   def json = [
           status:'fail',
           message:messageSource.getMessage('label.photo.validate.failed.message', [profile.photoAlbum.errorStrings].toArray(), LocaleContextHolder.locale)
   ]
   return json
}

if (!profile.save()) {
   def json = [
           status:'fail',
           message:messageSource.getMessage('label.photo.validate.failed.message', [profile.errorStrings].toArray(), LocaleContextHolder.locale)
   ]
   return json
}
else {
   def json = [
           status:'success',
           message:messageSource.getMessage('label.photo.insert.success.message', null, LocaleContextHolder.locale)
   ]
   return json
}

新しい写真オブジェクトを保存するには、大量のコードとエラー チェックのように思えます。Web サイトや本で grails の例を見ても、エラー チェックがあまり行われていません。私の場合、写真を保存できない場合、サービスは json エラー文字列をクライアントに返す必要があります。GORM Gotchas 2 の投稿を読みましたが、カスケード セーブについてはまだよくわかりません。

photo.save() と profile.photoAlbum.save() を呼び出さずに profile.save() を呼び出すと、一時的な例外が発生することがわかりました。だから私は photo.save() と profile.photoAlbum.save() を追加して、すべてを機能させました。

4

1 に答える 1

1

@Creggが述べたように、DBへのすべての呼び出しを1つのトランザクションで処理するには、すべてのロジックをサービスに移動する必要があります。一時的な例外を取得しないようにするには、次を使用してみてください。

profile.save(flush: true, failOnError:true)

ErrorControllerすべての例外を処理するために作成する必要があります。を参照してください。

于 2013-10-30T08:29:19.967 に答える