2017-06-23 1 views
1

Grailsの3.2.10、ゴーム6.1.4永続化されていないオブジェクト。コマンドオブジェクトをコントローラのupdateメソッドに送信すると、コントローラは期待どおりに実行されます(すべてのログメッセージが正常に印刷されます)。NOエラーがスローされます。リダイレクトページは、更新されたデータでもフラッシュメッセージが表示されているのと同じように表示されます。ただし、データベースの値は実際には更新されません。私はオブジェクトを作成することができますが、これは更新のためだけです。Grailsのドメイン5.2.9</p> <p>Iは、Grailsのドメインオブジェクトと基本的なCRUD操作を実行し、対応するコントローラを(それがスカフォールドはない)持って休止、

答えて

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()

+0

奇妙な名前を変更したい:あなたは、明示的に他のドメインクラスのメソッドの内部セッターやゲッターを呼び出す必要がありますGorm 6とHibernate 5へ –

関連する問題