2011-10-22 3 views
6

hashcode()toString()을 구현하지 않고 프로그램을 실행하면 정상적으로 작동합니다. 하지만 hashcode()toString()을 포함하는 즉시이 "로드 컬렉션에 대한 잘못된 액세스"오류가 발생합니다."컬렉션로드 불법 액세스"오류

내 HBM 파일은

1) booking.hbm.xml

에게
<many-to-one name="userId" class="User" column="user_id" 
     insert="true" update="true" cascade="save-update" > 
    </many-to-one> 
    <many-to-one name="flightId" class="FlightSchedule" 
     column="flight_id" cascade="all" not-null="true"> 
    </many-to-one> 

    <set name="passenger" table="passenger79215" lazy="false" 
     inverse="true" cascade="save-update"> 
     <key column="reference_id" /> 
     <one-to-many class="Passenger" /> 
    </set> 

2) Passenger.hbm.xml

<many-to-one name="referenceid" class="Booking" lazy="false" 
     insert="true" update="true" column="reference_id " 
     cascade="save-update"> 
    </many-to-one> 

3) User.hbm 있습니다 .xml

<set name="booking" table="bookings79215" lazy="true" 
     inverse="false" cascade="save-update"> 
     <key column="user_id" /> 
     <one-to-many class="Booking" /> 
    </set> 

누구든지 오류를 설명 할 수 있습니까?

답변

6

해시 코드 및 같음 메서드가 제대로 작동하지 않습니다. 그것들이 올바른지 확인하십시오. toString()은 컬렉션 클래스와는 아무 관련이 없지만 해시 코드와 같음은 않습니다.

해시 코드뿐만 아니라 해시 코드와 같음도 모두 재정의했다고 가정합니다.

Object#hashCode() (Java Platform SE 7)

+0

안녕하세요 라비 ...이 HashCodeBuilder.reflectionHashCode (이)처럼 오버라이드있다; EqualsBuilder.reflectionEquals (this, obj); ToStringBuilder.reflectionToString (this); –

+0

타사 도구를 사용하여 해시 코드를 생성하면 멤버 변수를 기반으로 고유 해시 코드가 생성되지 않을 수 있습니다. 두 개의 다른 객체에 대해 동일한 값을 보유하는 필드가 있으면 잘못 된 해시 코드를 얻을 수 있습니다. 직접 해시 코드를 생성 해보십시오 (또는 클래스를 마우스 오른쪽 버튼으로 클릭 한 상태에서> 소스 -> 해시 코드 생성 및 같음) –

+0

hello ravi ... 나도 Hashcode() 및 equals()를 생성했습니다. 제공하고 여전히 같은 오류를주고 있습니다 ... –

2

난 당신이 등호 및/또는 해시 코드에서 (Hibernate에 의해 관리) id 필드를 사용하지한다고 생각합니다.

같음 및 hashCode는 비즈니스 로직이 같아야 구현되어야합니다.

0

동일한 오류가 있지만 해상도가 다릅니다. OP와 마찬가지로 저는 Apache의 해시 코드 빌더를 사용하고 있습니다. 내 개체는 일대 다 관계가있는 부모 및 자식입니다. 하위 키는 Parent를 멤버로 포함하므로 외래 키가 올바르게 설정됩니다.

문제는 해시 코드 빌더가 모든 멤버 필드를 사용하지만 Child가 생성 될 때 부모가 아직로드를 완료하지 못했기 때문입니다. 해시 코드 빌더가 Parent를 참조 할 때 Hibernate는 Parent가 여전히로드되어 있기 때문에 예외를 throw합니다.

수정 프로그램은 자녀의 해시 코드의 해시 코드 빌더에서 부모 참조를 제외하는 것이었다과 같다 :

@Override 
public boolean equals(final Object obj) 
{ 
    return EqualsBuilder.reflectionEquals(this, obj, "parent"); 
} 

@Override 
public int hashCode() 
{ 
    return HashCodeBuilder.reflectionHashCode(this, "parent"); 
}