2011-12-21 2 views
0

AJAX를 통해 양식의 레코드를 업데이트하고 있습니다. 내 개체에 매핑되는 JSON 객체를 가지고 있고, 내 컨트롤러 방법은 다음과 같습니다는 개체의에 의해 기존 기록을 발견하지 않은 경우봄 JSON 병합

@RequestMapping(value = "/vendors", method = RequestMethod.POST) 
public ResponseEntity<String> saveVendorsJson(@RequestParam String vendor) { 
    Vendor v = Vendor.fromJsonToVendor(vendor); 

    if (v.merge() == null) { 
     v.persist(); 
    } 
    return new ResponseEntity<String>(HttpStatus.OK); 
} 

내가 null를 돌려줍니다 (v.merge 문서)에서 예상 'id'필드를 병합 할 수 있으며,이 경우 새 Vendor 객체로 유지하려고합니다.

내 JSON이 기존 레코드와 일치하는 'id'필드 값을 가지고 있는데도 브라우저에서 업데이트 된 상품으로 새 레코드를 삽입하고 있습니다.

나는 여기에 이중 의무를 부과하는 POST 방법을 사용하고 있음을 알고 있습니다. 엄격히 RESTful하지 않습니다. 이론적으로, 이것은 나를 위해 더 간단합니다 (물론 그것이 사실이 아님이 드러났습니다).

+0

'Vendor'는'.merge()'와'.persist()'를 구현하는 것을 확장하는 커스텀 클래스라고 가정합니다. 당신이 언급 한 구현 클래스와 "문서"는 무엇입니까? 위의 내용이 정확하면 모든 것이 정확 해 보이며 작동해야합니다. –

+0

Vendor는 스프링 - 루어 어노테이션 인'@ RooEntity'에 의해 모델화 된 POJO입니다. 이것은'persist()'메소드의 출처입니다. –

+0

내가 작업하고있는 문서는 [here] (http://static.springsource.org/spring-roo/reference/html/base-json.html)에서 "merge"문자열을 검색하십시오. –

답변

0

나는 이것이 최대 절전 모드 일 것이라고 생각한다. Hibernate는 그것이 이미 존재하는지 모른다면 "merge"하지 않을 것이다. 나는 과거에 한 일은 조회를 한 다음 지속하는 것입니다. 제 생각에 전선에서 들어오는 것을 병합하려고한다면 Primary Key Collision 또는 유사한 것을 얻을 것입니다. 나는 Hibernate가 기존 객체를 생성하거나 편집하고 있는지를 나타내는 일종의 "더티 (dirty)"플래그를 내부에 가지고 있다고 생각한다.

또한 원시 - 최대 절전 모드로 소프트 조회를 수행하는 데 사용되는, 기본적으로 최대 절전 모드를 말해 "봐, 내가이 개체를 가지고, 내가 원하는 일을하고 싶지 않아 - 어쩌구, 그냥 일부 필드를 업데이트하려고합니다. " 개체를 캐시에로드하고 SELECT를 먼저 수행하지 않고 업데이트 할 수 있습니다. Spring에도 updateOrSave()가 있지만 실제로 SELECT를 먼저 수행합니다.