2012-05-04 3 views
0

동일한 서비스 (트랜잭션) 내에서 동일한 엔티티를 병합 (업데이트) 한 후 해당 엔티티를 자식 (조인)으로 선택하려고합니다. 병합은 당신이 업데이트 한 객체를 반환한다는 것을 알고 있지만,이 객체는 데이터베이스의 데이터를 가진 모든 엔티티가 아닌 업데이트 된 데이터를 가지고 있습니다. 또한 병합 후 자식이 모두있는 엔터티를 가져 오려고 select를 실행하면 업데이트 된 데이터로만 업데이트 된 개체가 반환됩니다 (나머지 필드 및 자식 엔터티는 null 임).병합 후 선택 : 최대 절전 모드

문제를 해결할 방법이 있습니까? 커밋 전에 올바르게 실행되어야하는 많은 데이터베이스 작업이 서비스에 있기 때문에 동일한 트랜잭션에서 모든 것을 실행해야합니다.

감사합니다. 감사합니다.

+0

코드를 보여주십시오. 병합에 의해 반환 된 엔티티는 데이터베이스에 IS가 포함되어 있거나 최소한 세션이 플러시 된 후에 데이터베이스에 포함될 첨부 엔티티입니다. 나머지 필드가 null 인 경우 세션이 플러시되면 데이터베이스에서 null이됨을 의미하므로 큰 문제가 있음을 의미합니다. –

+0

맞습니다만 엔티티의 한 필드 만 업데이트하려고합니다. 그래서이 필드로 엔티티 개체를 만들고 나머지는 null입니다. 그래서 당신의 대답을 이해할 수있는, 나는 모든 필드를 엔티티를 구축해야 ... 내가 업데이 트하려는 필드를 업데이 트하는 방법이 아닌가요? – user1260893

+0

그런 다음 세션에서 엔티티를 가져 와서 필드를 설정합니다.'Foo f = session.get (Foo.class, id); System.out.println ("done"); ' –

답변

0

모두 코드 구조에 따라 다릅니다. 달성하려는 목표에 대해 더 많은 정보/코드를 제공 할 수 있다면 도움이 될 것입니다.

엔티티와 하위 항목간에 계단식 옵션을 올바르게 설정했는지 확인하십시오. 병합 작업을 위해 캐스케이드를 설정할 수 있습니다. 병합 작업은 하위 작업도 새로 고쳐야합니다. (참고 : 이것은 지연로드의 경우 병합 작업 전에 자식 중 하나가 가져온 경우에만 작동합니다).

그리고 두 번째 질문은 다시 코드를 구조화 한 방법과 db에서 데이터를 가져 오는 방법에 따라 달라집니다. 그러나 이상적으로 하나의 요청/작업 단위와 관련된 모든 데이터베이스 작업은 하나의 트랜잭션 내에서 처리되어야합니다.

+0

캐스케이드에서 업데이트하고 싶지 않습니다 ... 내 데이터베이스에 내 JSP에 표시되는 행이 있습니다. 하나의 필드 만 수정 한 다음이 수정을 포함하는 객체를 제출합니다 (따라서 엔티티에 ID와 필드가 수정되고 나머지 필드는 null). 내 의도는 수정 된 필드를 업데이 트하지만 지금은 내가 할 수있는 나의 의심이 있습니다. – user1260893

+0

Id 및 수정 된 필드 만 갖는 새 엔티티를 만들 수 있습니다. 이 엔티티에 다른 모든 필드 (값으로 널 (null)을 전달하는)를 추가하지 마십시오. 희망이 당신의 문제를 해결합니다. – sak