2011-10-22 15 views
6

Quando eseguo il mio programma senza implementare hashcode() e toString(), quindi funziona correttamente. Ma non appena includo hashcode() e toString(), ottengo questo errore "accesso illegale alla raccolta di caricamento".Errore "accesso illegale alla raccolta di caricamento" errore

miei file HBM sono

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> 

Qualcuno può spiegare l'errore?

risposta

6

I metodi hashcode e equals non funzionano correttamente. Assicurati che siano corretti. toString() non ha nulla a che fare con le classi di raccolta, ma lo fa hashcode e equals.

Presumo che sia stato eseguito l'override sia di hashcode che di equals e non solo hashcode.

Object#hashCode() (Java Platform SE 7)

+0

Ciao Ravi ... Ho Overrided come questo HashCodeBuilder.reflectionHashCode (questo); EqualsBuilder.reflectionEquals (this, obj); ToStringBuilder.reflectionToString (this); –

+0

Si sta facendo affidamento su uno strumento di terze parti per generare il proprio codice hash, che potrebbe non riuscire a generare hashcode distinto in base alle variabili membro. Se hai un campo che contiene lo stesso valore per due oggetti diversi, potresti ottenere un codice hash errato. prova a generare codice hash (o se ti capita di usare Eclipse, all'interno della classe fai clic con il tasto destro-> Origine-> genera codice hash e uguale a) –

+0

ciao ravi ... ho anche generato Hashcode() ed equals() nel modo in cui tu fornito e sta ancora dando lo stesso errore ... –

2

penso che non si dovrebbe usare il campo ID (gestito da Hibernate) in pari e/o hashCode.

Equal e hashCode devono essere implementati come una logica di business uguale.

0

Ho avuto lo stesso errore ma con una risoluzione diversa. Come l'OP sto usando il builder di hash di Apache. I miei oggetti sono padre e figlio con una relazione uno-a-molti. Il figlio include Parent come membro in modo che la chiave esterna venga impostata correttamente.

Il problema è che il builder di hashcode utilizza tutti i campi membri, ma quando viene creato il figlio, il suo genitore non ha ancora finito di caricare. Quando il builder di hashcode fa riferimento al membro principale, Hibernate genera l'eccezione perché il genitore è ancora in fase di caricamento.

La correzione è stato quello di escludere il genitore di riferimento dal costruttore codice hash in hashCode del bambino ed è pari a:

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

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