2013-11-28 1 views
0

나는 최대 절전 모드로 지속되는 Player라는 클래스가 있고 생성 된 ID와 복합 자연 ID가 있다고 가정 해 보겠습니다. 플레이어는 ID를 생성 한 다른 객체의 계층 구조를 저장하는 복합 클래스입니다.hibernate 프라이 머리 키가없는 객체를 저장하거나 업데이트한다.

json 웹 서비스를 쿼리하여 Player 인스턴스를 가져올 수 있습니다. json은 잭슨에 의해 파싱됩니다. 잭슨은 생성 된 ID가 하나도없는 것을 제외하고는 전체 Player 객체를 만듭니다. 본질적으로이 플레이어 인스턴스에서 saveOrUpdate를 수행하려고합니다.

하나의 옵션은 자연 ID로 Player 객체에 대해 데이터베이스를 쿼리하는 것입니다. 오브젝트가 리턴되지 않으면 저장하십시오. 그렇지 않으면 수동으로 Player 객체의 모든 값과 모든 필드를 웹 서비스에서 데이터베이스의 객체로 복사 한 다음 업데이트를 수행합니다. 비효율적이며 많은 추가 코드가 포함될 것이므로이 옵션이 마음에 들지 않습니다.

내가 원하는 것은 웹 서비스의 개체에 데이터베이스 개체의 생성 된 ID를 복사 한 다음 해당 개체에 대한 업데이트를 수행하는 것입니다. 불행히도 나는이 일을 할 수 없었다. 나는 트릭을 할 것 병합()를 사용하여 생각했지만, 나는이 예외가 얻을 :

이 시나리오를 처리하는 가장 좋은 방법은 무엇입니까

를 발견 주어진 식별자를 가진 두 개 이상의 행 :

org.hibernate.HibernateException를?

+0

시도'session.update (OBJE)는'당신이에 의해 잭슨 생성 된 ID를 전달 할 수 있도록 무엇을 의미하는지 정말 모르겠어요 병합() – jos

답변

0

내가 왜 잭슨이 클라이언트에 생성 된 ID (PK라고 가정)를 전달하지 못하게했는지 물어볼 수 있습니까? 그렇게했다면 Player 객체를 유지하도록 업데이트를 저장할 수 있습니다.

잭슨이 PK (실제로는 PK와 이름을 사용하므로 링크를 만들 수 있음)를 사용하여 다른 객체 (동일한 메소드로 처리되지 않아야하는 엔티티와 콜렉션)와의 관계를 처리합니다. @JsonSerialize를 사용하여 직렬화.

내 엔티티가 다른 엔티티/콜렉션을 참조하지만, DTO, 변환 또는 추가 db 액세스를 사용하여 CRUD 연산을 간단하게 수행 할 수 있습니다.

BR, 옌스

+0

의 insted. 웹 서비스를 제어 할 권한이 없습니다. 나에게 다중 레벨 해시 테이블을 보내고 생성 된 ID를 루트 객체에 추가한다. 그렇지 않으면 복합 키를 사용해야한다. 동일한 이유로 객체의 모든 목록/맵에 ID를 추가합니다. – Sarevok

관련 문제