Grailsの3.2.10、ゴーム6.1.4永続化されていないオブジェクト。コマンドオブジェクトをコントローラのupdateメソッドに送信すると、コントローラは期待どおりに実行されます(すべてのログメッセージが正常に印刷されます)。NOエラーがスローされます。リダイレクトページは、更新されたデータでもフラッシュメッセージが表示されているのと同じように表示されます。ただし、データベースの値は実際には更新されません。私はオブジェクトを作成することができますが、これは更新のためだけです。Grailsのドメイン5.2.9</p> <p>Iは、Grailsのドメインオブジェクトと基本的なCRUD操作を実行し、対応するコントローラを(それがスカフォールドはない)持って休止、
1
A
答えて
1
はかなりフラストレーションの後、最新のゴームやHibernateは、ドメインオブジェクトのsetXXX
メソッドを監視していると思われ、これらのメソッドが呼び出されていない場合は休止状態が変更されたオブジェクトは表示されませんし、すべての変更を更新しません。ログレベルを上げると、ハイバネートはオブジェクトが変更されていると見なされず、無視されました。
私の問題は、this.xxx = CommandObject.xxx;
を呼び出すドメインオブジェクト内にsetData(CommandObject)
メソッドを持つことを中心にしており、生成されたセッターをバイパスし、オブジェクトが変更されていないと思うことを休止状態にさせました。
コントローラから直接セッターを呼び出すことは、この問題の回避策です。
(動作しない)例:
class Person {
String name
//...typical constraints, methods, etc...
void setData(PersonCommand c){
this.name = c.name;
}
}
class PersonController {
//...typical list, show, create methods...
def update(PersonCommand pc){
//... validation ...
Person p = Person.get(pc.personId);
p.setData(pc);
p.save(failOnError: true);
flash.message = "Successfully saved person ${p.name}"
redirect(action: 'show', id: p.id)
}
}
FIXED例(仕事をしている):
class Person {
String name
//...typical constraints, methods, etc...
}
class PersonController {
//...typical list, show, create methods...
def update(PersonCommand pc){
//... validation ...
Person p = Person.get(pc.personId);
p.name = pc.name;
//... set other fields ...
p.save(failOnError: true);
flash.message = "Successfully saved person ${p.name}"
redirect(action: 'show', id: p.id)
}
}
0
これはよく知られているドメインクラスの落とし穴です。このコードは、罰金前に働いていた
class Person {
String name
void setData(PersonCommand c){
setName c.name
}
}
をまた、私はPOGOs法との衝突を避けるためにapplyData()
のようになめらかにするsetData()
関連する問題
- 1. CodeigniterとDatamapperを使った基本的なCRUD操作
- 2. Grailsのカスケードは、私は1を持っている私のGrailsのドメインで
- 3. 私は休止状態と春4 MVCでの基本的なCRUDをやろうとしている - SPRING 4
- 4. 基本的なCRUD操作のクエリパラメータをループバックで定義する
- 5. Grails remoteFieldクライアントの基本的な検証
- 6. grailsドメインオブジェクトをJSONに変換して操作する
- 7. MVC 5アプリケーションのAzure DBに対する基本的なCRUD操作
- 8. Grailsの2.0 <G:javascriptの>は、それはdoesnのように私は新しいGrailsのプロジェクトを作成し、それを実行している
- 9. 基本的なCRUD操作のためのローカル電子ソリューション
- 10. それは私が含む基本的なClojureのスクリプト持っ
- 11. Hibernateのフィルターは、私は私のリポジトリにこの休止フィルタを持っているFindOne CRUD操作
- 12. PGTとPGTIOUの保存CASが生成する
- 13. やって基本的なUNIXの操作Python的な方法
- 14. Grailsは子ドメインオブジェクトを取得します
- 15. と休止状態Grailsのフィルタ
- 16. Grailsのドメインオブジェクト格納マップ<K,V>
- 17. Grailsは私はこのようなリストを持っている
- 18. Lubridateはlubridateで、この基本的な操作の実行負MMとSS
- 19. Grails:コントローラのドメインの制約を動的に変更する
- 20. ビューは、私は基本的なコントローラを持つコントローラ
- 21. は、私はそれが次のエラーを示し、基本的なデモアプリケーションを実行しているのmaven
- 22. Grailsは、私が現在のGrails 1.3.7上で実行されているのGrailsアプリケーションを持っている1.3.7から3.2.6へ
- 23. JSONとネストされたGrailsドメインオブジェクトのバインド
- 24. フォームアクションは、私は、フォームを持っている基本的なURL
- 25. GrailsはコントローラにGrailsの一缶 'bindData' は
- 26. grailsはドメインオブジェクトを動的にアクセスします
- 27. は私が<i> ID</i>と<i>用語</i>フィールドで構成される基本的なMySQLのテーブル、<i>用語</i>を、持っている別のクエリ
- 28. テーブルからランダムな行を返すGrails GORM?私が持っている私のGrailsアプリケーションで
- 29. Grailsのxmlをドメインオブジェクトに変換する
- 30. Grails/Groovy CRUDサービス
奇妙な名前を変更したい:あなたは、明示的に他のドメインクラスのメソッドの内部セッターやゲッターを呼び出す必要がありますGorm 6とHibernate 5へ –