2012-07-09 10 views
22

Grailsのドキュメントのいくつかをスキップして、Grailsのread()メソッドに関するthisビットが見つかりました。私がこれを正しく理解しているならば、明示的なsave()呼び出しで保存されるデータベースからオブジェクトの "読み取り専用"バージョンを取得することができます。変更する予定のないオブジェクトがある場合はいつでも、read()コールを使用する必要があります。Grailsのobject.get()vs object.read()のメリット

しかし、なぜあなたはいつもread()コールを使用しないのですか?オブジェクトはsave()の場合は読み取り/書き込み権限に変更されるため、オブジェクトを取得するのではなく読み込むほうが安全でしょうか?

答えて

17

あなたはおそらく正しいでしょう - ほとんどの場合、これは同等です。しかし、Hibernateは、フラッシュ中にダーティチェックを行い、Grailsは "Open Session in View"インターセプタを使用するので、各リクエストの終わりに常にフラッシュされるので、save()に電話する必要はありません。これは、get()によって取得されたインスタンスを変更した人が、ビューのレンダリング中に一時的なものに過ぎないことを意味していましたが、とにかくsave()呼び出しを行わずに変更が維持されることを驚かせます。 read()がそのシナリオではより意味をなさないでしょう。

1つのパフォーマンスの最適化は、http://grails.org/doc/latest/ref/Database%20Mapping/dynamicUpdate.htmlを使用して、変更されたフィールドのみをデータベースにプッシュします。デフォルトでは、変更があったかどうかにかかわらず、すべてのフィールドをプッシュすることになります。それ以来、各アップデートに対して新しいSQLを生成する必要はありません。 read()インスタンスの場合、Hibernateは元のデータを保持しないので、どのフィールドがダーティであるかを知る方法がないため、動的更新はできません。

+0

したがって、read()とobjectを行い、プロパティを変更してセッション全体がフラッシュされると、そのオブジェクトはデータベースに正しく伝播されません。オブジェクトは、そのインスタンスでsave()を明示的に呼び出すと、フラッシュされます。これは正しいです? – Viriato

+1

修正 - 自動的に自動フラッシュを無効にしますが、明示的なフラッシュは無効にしません –