2011-10-22 8 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()はコレクションクラスとは関係ありませんが、hashcodeとequalsは何もしません。

ハッシュコードだけでなく、hashcodeとequalsの両方をオーバーライドしたとします。

Object#hashCode() (Java Platform SE 7)

+0

こんにちはラヴィ...私はこの HashCodeBuilder.reflectionHashCode(この)のようにオーバーライドしています。 EqualsBuilder.reflectionEquals(this、obj); ToStringBuilder.reflectionToString(this); –

+0

サードパーティのツールを使用してハッシュコードを生成しているため、メンバー変数に基づいて異なるハッシュコードが生成されない場合があります。 2つの異なるオブジェクトの同じ値を保持するフィールドがある場合、間違ったハッシュコードを取得する可能性があります。 自分自身でハッシュコードを生成しようとすると(または、クラス内で右クリック→ソース→ハッシュコードと等価を生成するEclipseが使用された場合) –

+0

hello ravi ...私はHashcode()とequals()提供されていますが、それでも同じエラーが発生しています... –

2

私はあなたがイコールおよび/またはのhashCode中(休止状態で管理される)idフィールドを使用してはならないと思います。

等価とハッシュコードは、ビジネスロジックが等しいと実装する必要があります。

0

私は同じエラーが発生しましたが、解像度は異なります。 OPのように私はApacheのハッシュコードビルダーを使用しています。私のオブジェクトは、1対多の関係を持つ親子です。子は、外部キーが正しく設定されるように、Parentをメンバーとして含めます。

問題は、ハッシュコードビルダはすべてのメンバーフィールドを使用しますが、Childが作成されているときにParentがまだ読み込みを終了していないことです。ハッシュコードビルダがParentを参照すると、HibernateはParentがまだロード中であるため例外をスローします。

修正が子供のhashCodeにおけるハッシュコードビルダーから親の参照を除外したと等しい:

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

@Override 
public int hashCode() 
{ 
    return HashCodeBuilder.reflectionHashCode(this, "parent"); 
} 
関連する問題