2012-01-18 4 views
0

다음과 같은 질문은이 기술과 관련이있다 : 3.1 최대 절전 모드 : 업데이트 관련 엔티티

  • 잭슨
  • 내선 JS 4
  • 한다고 가정

    • 최대 절전 모드 4 또는 3
    • 봄 나는 부모와 자식이라고하는 두 개의 테이블을 가지고 있습니다. 다음과 같이

      class Parent { 
          private int id; 
          private String name; 
      
          //getter and setter methods 
      } 
      

      아이 클래스는 다음과 같습니다 :

      표 : 부모

      class Child { 
          private int id; 
          private String name; 
      
          @ManyToOne // uni-directional many-to-one association to Parent 
          @JoinColumn(name = "parent_id") 
          private Parent parent; 
      
          //getter and setter methods 
      } 
      

      를 이제 데이터베이스에 이러한 데이터가 이미 거기에 다음과 같이

      부모 클래스입니다

      id name 
      =================== 
      1 parent one 
      2 parent two 
      

      테이블 : 아이

      id name   parent_id 
      ============================= 
      1 child one 2 
      

      문제는입니다 :

      Parent newParent = new Parent(); 
      newParent.setId(1); 
      
      Child child = new Child(); 
      child.setId(1); 
      child.setParent(newParent); 
      
      session.saveOrUpdate(child); 
      

      : 나는 이러한 개체를 사용하여 "부모이"을 "부모 일" 에서 "자식 하나"의 부모를 업데이트 할 수 에 대한 추가 정보는 JSON의 Spring MVC + Jackson에서 자식 개체를 자동 매핑하여 브라우저에서 ExtJS를 통해 전송합니다.

      JSON 형식은 다음과 같습니다 :

      {id: 1, name: "child one", parent: {id: 1, name: "parent one"}} 
      

      그래서, 아이 newParent 위에서 실제로 만든 스프링 MVC + 잭슨에 의해 암시 적으로을 설정 객체. 다음과 같이

      그래서 스프링 MVC 컨트롤러 내부의 실제 코드는 다음과 같습니다 또한

      @RequestMapping(value = "child/update", method = RequestMethod.POST) 
      @ResponseBody 
      public Map<String, ?> update(@RequestBody Child child) { 
      
          // validation for child object 
      
          session.saveOrUpdate(child) 
      
          // prepare response 
      } 
      

      여기 중요한 것은,있을 수 있습니다 브라우저에서 보낸 JSON 새로운 부모의 이름을 포함

      ... parent: {id: 1, name: "parent one"} ... 
      

      하지만 그 "name"프라퍼티는 Spring에 의해 매핑 될 수도 있고, Hibernate에 의해 생략 될 것이다. 왜냐하면 나는 단지 "child one"레코드를 업데이트하고, "parent one"레코드의 이름을 업데이트하지 않기 때문이다.

      HQL을 사용하면 쉽게 할 수 있다는 것을 알고 있습니다. 그러나 브라우저가 JSON을 보내고 Spring이 JSON을 자동으로 객체에 매핑 할 수 있으므로 HQL 대신 session.saveOrUpdate()를 사용하는 것이 더 쉽습니다.

      제안 사항 어떻게하면 되나요?

      대단히 감사합니다.

    답변

    2

    이러한 개체를 사용하여 "학부모 1"의 부모를 "부모 2"에서 "부모 1"로 업데이트 할 수 있습니까?

    짧은 대답 : 예.

    브라우저에서 JSON을 서버로 보냅니다. Spring은 요청을 받아서 update()에 매핑한다. Spring은 Content-Type 헤더를 검사하고 응답 본문에 application/json; Spring은 messageConverters에서 JSON을 처리 할 수있는 변환기가 있는지 확인합니다. Spring은 Jackson을 찾아 JSON을 Child 객체로 변환합니다. 이 객체는 saveOrUpdate()을 통해 최대 절전 모드로 저장하는 등 작업을 수행 할 수있는 update()으로 전달됩니다.

    parent 필드가 관계의 소유 측면 (그리고 주어진 모델에서 제공 한 것)이면 "아동 1"과 그 부모 간의 관계가 업데이트됩니다. 부모 에 제공된 이름은 일 수 있습니다. 이는 계단식 규칙에 따라 다릅니다.

    내부적으로 발생하는 현상은 새로운 ParentChild 개체를 생성하고 최대 절전 모드는 ID를 기반으로 기존 엔터티를 찾습니다. 상위 ID가 이미 존재하므로 saveOrUpdate()이 업데이트를 선택합니다.

    +0

    감사합니다. berbajay. 그러나 동일한 레코드를 두 번 업데이트하면 예외가 발생합니다. _org.hibernate.NonUniqueObjectException : 동일한 식별자 값을 가진 다른 개체가 이미 세션과 연결되어 있습니다 _ –

    +1

    이 경우 [merge] (http : // docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/Session.html#merge(java.lang.Object))를 사용하여 객체와 세션을 조화시킵니다. – beerbajay