Spring과 Hibernate를 사용하는 Grails 프로젝트 작업을 시작했습니다. 문제는 내가 코드를 다음과 같이 데이터베이스의 항목을 변경할 때Grails 컨트롤러가 데이터베이스 변경시 캐시를 리프레시하지 않습니다.
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 --%>
}
}
곳 field
, id
및 value
내가 존재하지하고 중요하지 않은 몇 가지 변수임을 발생한다. 데이터베이스 테이블 DeviceUser
에 저장되며 데이터베이스에 수동으로 연결하고 SELECT
문을 실행하여 확인할 수 있습니다. 이제 문제는 내가 localhost:8080/api/devices/1234
에 액세스 할 때 방법 show(id)
에 매핑되는 것으로, 발생 : 결과가 갱신되지 않습니다
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
를 설정 한 후 컴퓨터를 다시 부팅 시도했지만 여전히 변화가 없었다.
어디서 쿼리가 문제인지 추측 할 수 있습니다. 'id == idParam && device == deviceParam' – andi
@andi를 시도해 보면 findById가 문제라고 밝혀졌습니다. 어떻게 든 프로젝트에서 일하는이 친구들은 유일하지 않은 필드'device_id'를 가지고 있다고 생각하기 전에 생각했습니다. 무슨 일이 있었는지 내가 데이터베이스에 글을 올렸을 때 발견 된 데이터베이스의 첫 번째 오브젝트에 저장되었습니다.이 ID는 가장 높은 'id'('device_id'가 아닌 !!)입니다. 그러나'.get()'을 실행했을 때, 다른''device_id''를 가진 다른 객체를 리턴했습니다. 그래서'findById'를보다 명확하게 만들어야했습니다. 'findByIdAndUser'. 그리고 실제로 아무런 오류도없는 문제를 해결하기 위해 2 일을 보냈습니다. – campovski