2017-10-23 2 views
0

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, idvalue 내가 존재하지하고 중요하지 않은 몇 가지 변수임을 발생한다. 데이터베이스 테이블 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.fieldlocalhost:8080/api/devices/1234에 항상 1로 설정하는 형식으로 표시됩니다)에 user.field를 설정 한 후 컴퓨터를 다시 부팅 시도했지만 여전히 변화가 없었다.

+0

어디서 쿼리가 문제인지 추측 할 수 있습니다. 'id == idParam && device == deviceParam' – andi

+0

@andi를 시도해 보면 findById가 문제라고 밝혀졌습니다. 어떻게 든 프로젝트에서 일하는이 친구들은 유일하지 않은 필드'device_id'를 가지고 있다고 생각하기 전에 생각했습니다. 무슨 일이 있었는지 내가 데이터베이스에 글을 올렸을 때 발견 된 데이터베이스의 첫 번째 오브젝트에 저장되었습니다.이 ID는 가장 높은 'id'('device_id'가 아닌 !!)입니다. 그러나'.get()'을 실행했을 때, 다른''device_id''를 가진 다른 객체를 리턴했습니다. 그래서'findById'를보다 명확하게 만들어야했습니다. 'findByIdAndUser'. 그리고 실제로 아무런 오류도없는 문제를 해결하기 위해 2 일을 보냈습니다. – campovski

답변

0

질문이 해결되었습니다. 의견보기. 문제는 캐시에 있지만 데이터베이스에서 전체 테이블을 인쇄 한 후 성공적으로 디버깅 된 일부 이상한 데이터베이스 레이아웃에 있습니다.

관련 문제