Hibernate, one to many, hash code - null

0

Moj kod:

 @OneToMany(cascade = CascadeType.ALL, mappedBy = "b")
    private Set<A> a= new LinkedHashSet<A>();
...


 @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + (int) (id ^ (id>>> 32));
        result = prime * result + ((a== null) ? 0 : a.hashCode());  //tutaj error (pod spodem wrzucilem stack trace)
...
SEVERE: 
java.lang.NullPointerException
	at org.hibernate.engine.internal.StatefulPersistenceContext.getLoadedCollectionOwnerOrNull(StatefulPersistenceContext.java:752)
	at org.hibernate.event.spi.AbstractCollectionEvent.getLoadedOwnerOrNull(AbstractCollectionEvent.java:75)
	at org.hibernate.event.spi.InitializeCollectionEvent.<init>(InitializeCollectionEvent.java:36)
	at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1895)
	at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:558)
	at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:260)
	at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:554)
	at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:142)
	at org.hibernate.collection.internal.PersistentSet.hashCode(PersistentSet.java:447)
	at pewien.prywatny.pakiet.PewnaKlasa.hashCode(B.java:251)

Wiecie moze co tu sie dzieje ?

0

Jakie IDE generowało ten hash?

0

to byl eclipse

0

ech te multikonta... prawda @owen?

Najprawdopodobniej w setcie masz jakiegoś nulla.

0

mam dokladnie ten problem: https://forum.hibernate.org/viewtopic.php?f=1&t=976419

tylko ja mapuje za pomoca adnotacji.

mam dwukierunkowa relacje (one to many) i po stronie 'many' gdy zakomentowalem z hashcode pole:

@ManyToOne
@JoinColumn(name = "b")
private A a;

to wyciagniecie ze strony 'one' obiektu wraz z jego wszystkimi a dziala ok, ale czy moge miec tak przedytowanego hashcoda ?

0

znalazlem takie cos:

Your toString() implementations is most likely creating an infinite loop since the Person.toString() is printing the address and the Address.toString() is printing all persons. I would be very careful with navigating associations in toString(), equals() and hashCode() methods since that is likely to cause unwanted side-effects.

ok, toStribnga moge sie zawsze pozbyc, czy nie wszystko wypisywac... no ale hashcoe przeciez nie moge sobie tak po prostu miejscami zakomentaowac ?

0

A guzik. Dostałbyś stack overflow a nie null pointer. Też zgaduje ze w secie jest null albo coś w tych klimatach. Zapnij się.debugerem i zobacz, co za problem?

0

co rozumiesz przez "null w secie" ?

tworze go tak: private Set<A> a= new LinkedHashSet<A>(), a jak zrobie a.hashCode() to przeciez nie jest to na nullu.

Faktycznie probuje odczytac obiekt B, ktory akurat zawiera PUSTY zbior obiektow A. Ale przeciez to nie problem ?

0

co rozumiesz przez "null w secie" ?

tworze go tak:

 private Set<A> a= new LinkedHashSet<A>()

a jak zrobie a.hashCode() to przeciez nie jest to na nullu.

Faktycznie probuje odczytac obiekt B, ktory akurat zawiera PUSTY zbior obiektow A. Ale przeciez to nie problem ?

0

Nie rozmawiam z tobą póki nie zaczniesz myśleć i używać debuggera

0

:D

no przez kilkanascie godzin nie mam dostepu do tego kodu.

Jesli wiesz, jakie jest rozwiazanie to po prostu napisz :D

no i jeszcze jedno:

  1. po stronie ONE relacji zostawilem oryginalnego hashcode
  2. po drugiej stronie w hashcodzie() zakomentowalem linijke, ktora odwoluje sie drugiej strony relacji... i wszystko dziala, dlaczego :P ?
0

Ja obstawiam że czasem ta "druga strona" jest ustawiona na nulla i liczenie hashcode powoduje null pointer ex, ale to tylko zgadywanie. Zapnij się tam debugerem i zobaczysz co, gdzie i czemu jest nullem. Nie rozumiem czemu od razu tego nie zrobiłeś tylko założyłeś ten temat...

0

zalozylem temat, bo mnie to rozwalilo:

NPE polecial dokladnie w tej linijce: result = prime * result + ((a== null) ? 0 : a.hashCode());

a jest przeciez sprawdzenie, czy 'a'' nie jest nullem...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.