hibenate 흔 한 문제 원인 및 해결 방법 (1)

전재 출처 를 밝 혀 주 십시오:http://blog.csdn.net/soartju
저자: 고비
hibenate 의 조작 데 이 터 를 사용 하 는 과정 에서 update () 와 같이 hibenate a different object with the same identifier value was already associated with the session 이상 이 나타 날 때 가 있 습 니 다.
이 이상 한 설명 에서 이 이상 이 발생 한 원인 이 무엇 인지 대체적으로 알 수 있 습 니 다. 여러 개의 서로 다른 대상 이 같은 identifier (id 와 실체 유형 이 같 고 같은 데이터 베이스 에 기록 되 어야 합 니 다) 를 가지 고 업데이트 등 작업 을 할 때 이상 이 발생 합 니 다.
한 session 에 같은 데이터베이스 기록 (identifier 같은 여러 엔 터 티) 이 여러 개 나 나 왔 다 면, hibenate 는 그 엔 터 티 를 어떻게 판단 하 는 것 이 옳 을 까?따라서 hibenate 가 이 이상 을 던 지 는 것 은 당연 하 다.
문 제 는 이미 명확 하 게 말 했다. 바로 한 session 에서 여러 개의 실체 대상 이 데이터베이스 에 대응 하 는 같은 기록 으로 인해 발생 한 것 이다.
이러한 문제 가 발생 한 이 유 는 우리 가 이전에 특정한 session 을 통 해 특정한 실체 대상 (이 대상 은 hibenate 위탁 관리 가 있 음) 을 얻 었 기 때 문 입 니 다. 그러나 나중에 똑 같은 identifier (id 와 실체 유형 처럼 같은 데이터 베이스 에 기록 되 어야 함) 를 가 진 실 체 를 다시 구성 한 다음 에 이 session 에서 조작 (예 를 들 어 update) 했 기 때 문 입 니 다.새로 구 성 된 실체 가 만 든 것 이다.여기 서 말 하 는 재 구 조 는 코드 를 통 해 수 동 으로 구 조 된 유리 상태 (detached) 실체 일 수도 있 고 hibenate 의 직렬 연결 작업 을 통 해 불 러 온 실체 일 수도 있다.
우 리 는 구체 적 인 실례 를 통 해 설명 한다. (관건 적 인 코드 만 쓴다.)
실례 1. detached 실 체 를 수 동 으로 구성 하 는 경우:
Session sessionA = dao.getSession();  //     ,      sessionA     

Persion person1 = (Person) sessionA.load(Person.class,1); //  id=1 Person     

...

Person person2 = new Person();

person2.setId(1);  //      detached Person  ,id  1

person2.setName("gaofei"); 

...

sessionA.update(person2);  //person2 person1 identifier    ,   person1       ,     

...


    인 스 턴 스 2. hibenate 급 으로 불 러 오 는 경우: 한 학생 Student 가 한 반 Class 에 만 속 할 수 있다 고 가정 하면 한 교사 Teacher 도 한 반 Class 에 만 속 할 수 있 고 Student 와 Class 급 으로 불 러 와 서 저장 할 수 있 으 며 Teacher 와 Class 급 으로 불 러 와 서 저장 할 수 있 습 니 다.
4. 567913. 위의 예 를 통 해 우 리 는 같은 session 에서 같은 identifier 의 실체 가 여러 개 나 나 타 났 고 hibenate 에 이상 이 생 겼 음 을 알 수 있다.문제 의 해결 방법 은 session 의 위탁 관리 실 체 를 사용 하여 hibenate 에서 이 실체의 상 태 를 유지 하 는 것 이다.실례 1 에 대해 다음 과 같이 수정 할 수 있 습 니 다.
4. 567913. 인 스 턴 스 2 에 대해 다음 과 같이 수정 할 수 있 습 니 다.
4. 567913. 정리: 데이터 의 전체 조작 과정 에서 session 에서 이미 위탁 관리 한 실체 대상 을 계속 사용 하면 본 고 에서 언급 한 이상 을 해결 할 수 있다.만약 에 세 션 을 뛰 어 넘 는 조작 이 필요 하고 본 고 에서 언급 한 이상 이 발생 하면 을 참고 할 수 있다.

좋은 웹페이지 즐겨찾기