SpringとHibernateを使用するGrailsプロジェクトの作業を開始しました。問題は、私は、コードGrailsコントローラがデータベースへの変更時にキャッシュをリフレッシュしない
field
、
id
と
value
は、私が存在しないことが重要ではありませんいくつかの変数です
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
だった)私も0
(user.field
localhost:8080/api/devices/1234
には常に1
に設定されるように提示される)にuser.field
を設定した後、コンピュータを再起動しようとしたが、それはまだ変更されませんでした。
私はwhereクエリが問題であると推測します。 'id == idParam && device == deviceParam' – andi
@andiを試してみると、' findById'が問題であることが判明しました。どういうわけか、プロジェクトに取り組んでいたこれらの人は、一意ではないフィールド 'device_id'を持っているとみなしていました。何が起こったのかというと、データベースに書き込んだとき、データベースの最初のオブジェクトに保存されました。これは最も高い 'id'を持つものです(' device_id'ではなく!!)。しかし、 '.get()'を実行すると、同じ 'device_id'を持つ他のオブジェクトが返されました。ですから、私は 'findById'をより明示的にする必要がありました。 'findByIdAndUser'です。そして、実際には何のエラーもなかった問題を解決しようと2日間過ごしました。 – campovski