2013-07-03 15 views
7

C'è un'annotazione che mi manca o si tratta di una limitazione del recupero di ibernazione?Come si recuperano gli insiemi nidificati?

Entità:

class A { 
    Long id; 
    Set<B> b; 

    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "A_B", joinColumns = @JoinColumn(name = "A_ID"), inverseJoinColumns = @JoinColumn(name = "B_ID") 
    public Set<B> getBs() { 
     return b; 
    } 

} 

class B { 
    Long id; 
    Set<C> c; 

    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "B_C", joinColumns = @JoinColumn(name = "B_ID"), inverseJoinColumns = @JoinColumn(name = "C_ID") 
    public Set<C> getCs() { 
     return C; 
    } 

} 

Tao:

class ADaoImpl {  
    public A load(Long id) { 
     return new A((A) session.load(A.class, id); 
    } 
} 

Quando si tenta di caricare una A, ho un

Caused by: java.lang.NullPointerException 
at org.hibernate.engine.internal.StatefulPersistenceContext.getLoadedCollectionOwnerOrNull(StatefulPersistenceContext.java:853) 
+0

quale versione di Hibernate stai usando? – yair

+0

si prega inoltre di postare la traccia dello stack completo (almeno fino al proprio codice). – yair

+0

Ad ogni modo sembra un bug Hibernate per me. Ho cercato il loro DB di errore ma nulla con NPE in 'StatefulPersistenceContext.java: 853'. Potresti presentare un bug allora. – yair

risposta

1

penso che non è l'eccezione completa giusto?

Dov'è il setter in classe A? La raccolta b in classe A è amichevole scopata, quindi l'ibernazione non sarà in grado di scrivere/iniettare il suo valore. Lo stesso vale per la raccolta C in classe B.

Per favore, copia il tuo hibernate.xml e qualsiasi altra classe di configurazione qui. Anche la versione hibernate/java è importante.

+0

Questa è l'eccezione giusta. E si può presumere che i DAO funzionino correttamente diversamente e abbiano tutti i metodi getter e setter necessari – stackoverflow

+0

Se solo fosse la mancanza di un setter appropriato, Hibernate non getterebbe NPE ... – yair

+0

Non so perché dici questo, ma se è vero, sarebbe comunque un bug Hibernate. (a meno che Hibernate documenti questo comportamento - che probabilmente non lo fa). – yair

6

Avevo un problema molto simile a quello che avevo set nidificati, e i metodi hashCode per ciascuno si presentavano nella traccia dello stack. Nei metodi hashCode, si sono riferiti l'un l'altro, quindi ho rimosso il riferimento a ciascun oggetto nei metodi hashcode e non ho più ricevuto queste eccezioni

+0

C'è impostato anche nella mia classe e risolto la stessa eccezione rimuovendo il riferimento l'un l'altro in HashCode ed Equals. – Junjie

+0

con cosa l'hai sostituito? –

+0

Grazie mille, ho avuto un '@ Data' da lombok e stava generando il mio metodo' hashCode' usando tutte le proprietà. Ho appena aggiunto '@EqualsAndHashCode (exclude = {" mySet "})' e ha funzionato! – tehCivilian

Problemi correlati