2012-02-07 11 views
17

私はGrailsのコンソールでこのコードを実行する場合:なぜGORMはオブジェクトを保存しませんか?

def p = new Post(title: "T"); 
p.save(flush: true); // or p.save(); 

Post.count(); 

GORMは、例外をスローされていないが、データは私のDBに保存されていません。私は間違って何をしていますか?

+0

grails.gorm.failOnError=true 

を追加することで動作をグローバルに変更する必要があります新しいオブジェクトを作成した直後... :( – Topera

答えて

30

制約違反の可能性があります。保存メソッドのパラメータにfailOnError: trueを追加します。次に、保存が失敗したときに例外が発生します。 (または、戻り値をsaveからチェックすることができます。また、falseの場合はp.errors.allErrors()を出力してください)

検証と保存は一緒に行われます。いくつかのドメインオブジェクトにバインドされているユーザーから送信されたデータを検証する場合は、無効な入力による保存の失敗をチェックするために、慣用的なことはsaveの戻り値をチェックすることです。無効な入力が原因で失敗することは例外的な動作ではありません。オブジェクトの内容を保存したいだけで、問題が発生した場合は例外をスローするには、failOnErrorを使用します。

GORMを設計した理由の詳細については、see this articleを実行する必要があります。

+1

+1のリンク –

+0

ドメインオブジェクトに対して 'validate()'を使用することもできます。falseを返した場合は、 'save()'メソッドを呼び出さないでください。代わりに、コントローラにユーザーにメッセージを返します。 –

+0

failOnError:trueを設定し、例外は発生しませんが、オブジェクトはGrailsによって「保存されていません」とマークされていますか? –

11

Postのいくつかの制約に違反しているため、オブジェクトが保存されていない可能性があります。 GORMのデフォルトの動作は、失敗した保存に失敗しないことに注意してください。あなたは私、私の行を削除して、コードの別の部分を持っていたいずれかの

p.save(flush: true, failOnError: true); 

のようにそれを呼び出すか、私の場合は、あなたのConfig.groovy

関連する問題