다음과 같은 질문은이 기술과 관련이있다 : 3.1 최대 절전 모드 : 업데이트 관련 엔티티
한다고 가정
- 최대 절전 모드 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()를 사용하는 것이 더 쉽습니다.
제안 사항 어떻게하면 되나요?
대단히 감사합니다.
감사합니다. berbajay. 그러나 동일한 레코드를 두 번 업데이트하면 예외가 발생합니다. _org.hibernate.NonUniqueObjectException : 동일한 식별자 값을 가진 다른 개체가 이미 세션과 연결되어 있습니다 _ –
이 경우 [merge] (http : // docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/Session.html#merge(java.lang.Object))를 사용하여 객체와 세션을 조화시킵니다. – beerbajay