2017-10-23 13 views
0

SpringとHibernateを使用するGrailsプロジェクトの作業を開始しました。問題は、私は、コードGrailsコントローラがデータベースへの変更時にキャッシュをリフレッシュしない

fieldidvalueは、私が存在しないことが重要ではありませんいくつかの変数です
class AlarmsController implements UserAware { 
    def saveAlarm() { 
     def user = DeviceUser.findById(id) 
     user.field = value 
     user.save(failOnError: true, flush: true) 

     render serialize(user) as JSON <%-- not relevant --%> 
    } 
} 

と次のようにデータベース内のエントリを変更したときという問題が生じます。データベーステーブルDeviceUserに保存され、データベースに手動で接続してSELECTステートメントを実行することで確認できます。さて問題は、私は方法show(id)にマッピングされているlocalhost:8080/api/devices/1234にアクセスしたときに、起こる:

class DeviceUserController implements UserAware { 
    def show(id) { 
     def deviceUser = DeviceUser.where({ 
      id = id, 
      device = device 
     }).get() 

     render serialize(deviceUser) as JSON 
    } 
} 

結果は(もハードリフレッシュを実行した後、それがCTRL + F5ある)リフレッシュされません。私はコンテンツがキャッシュされていると仮定していますが、それは実際にはありますが、私が問題を見つけたので、flush: trueは、次の呼び出しでキャッシュされたコンテンツを取得しないようにすべきです。

serialize(content)は、contentをJSONマップに変換するクラスメソッドです。


evict(DeviceUser)のような別のものを試しましたが、何も機能しませんでした。 (データベースには0たものの値は、まだ1だった)私も0user.fieldlocalhost:8080/api/devices/1234には常に1に設定されるように提示される)にuser.fieldを設定した後、コンピュータを再起動しようとしたが、それはまだ変更されませんでした。

+0

私はwhereクエリが問題であると推測します。 'id == idParam && device == deviceParam' – andi

+0

@andiを試してみると、' findById'が問題であることが判明しました。どういうわけか、プロジェクトに取り組んでいたこれらの人は、一意ではないフィールド 'device_id'を持っているとみなしていました。何が起こったのかというと、データベースに書き込んだとき、データベースの最初のオブジェクトに保存されました。これは最も高い 'id'を持つものです(' device_id'ではなく!!)。しかし、 '.get()'を実行すると、同じ 'device_id'を持つ他のオブジェクトが返されました。ですから、私は 'findById'をより明示的にする必要がありました。 'findByIdAndUser'です。そして、実際には何のエラーもなかった問題を解決しようと2日間過ごしました。 – campovski

答えて

0

質問が解決されました。コメントを参照してください。問題はキャッシュではなく、データベースからテーブル全体を印刷した後に正常にデバッグされたいくつかの奇妙なデータベースレイアウトでした。

関連する問題