2013-06-19 26 views
7

Ho entità Utente e GrantedRole che hanno una relazione bidirezionale uno-a-molti.JPA/Hibernate risultati bidirezionali bidirezionali in StackOverflowException

Quando provo ad aggiungere un GrantedRole al Set in uso, non esiste alcuna eccezione gettato, ma quando metto a punto le variabili per l'utente e l'oggetto GrantedRole avere una descrizione che si legge

com.sun.jdi.InvocationException occurred invoking method.

I diversi campi per le variabili possono essere letti durante il debug, ma quando seleziono il campo ruoli in Utente o il campo utente in GrantedRole ottengo la stessa descrizione di cui sopra. Quando vado nel set di GrantedRole a utente, alla fine ho trovato la seguente descrizione:

Detail formatter error: An exception occurred: java.lang.StackOverflowError

Il mio codice:

public class User { 
    private Set<GrantedRole> roles = new HashSet<GrantedRole>(); 

    public User() { 
     super(); 
    } 
    public User(String name, String password) { 
     this.name = name; 
     this.password = password; 
    } 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "user") 
    public Set<GrantedRole> getRoles() { 
     return roles; 
    } 

    public void setRoles(Set<GrantedRole> roles) { 
     this.roles = roles; 
    } 

    // equals and hashCode are based on username 
    // toString is based on all fields 
} 

public class GrantedRole { 
    private user user; 

    public GrantedRole() { 
     super(); 
    } 
    public GrantedRole(User user, Role role, Organization organization) { 
     this.user = user; 
     this.role = role; 
     this.organization = organization; 
    } 

    @ManyToOne 
    @NotNull 
    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    // equals and hashCode are based on all fields 
    // toString was based on all fields, I've changed it to not include User. 
} 

public class Test { 
    public void testStuff() { 
     User user = new User("name"); 
     GrantedRole role = new GrantedRole(user, "role"); //this sets the user field 
     user.getRoles().add(role); //doesn't throw Exception, but debugging shows InvocationTargetException and StackOverflowException 
     System.out.println(user.getRoles()); //throws StackOverflowException, as I would expect 
    } 
} 

Era la mia comprensione che dovrei essere in grado di creare un bidirezionale relazione in questo modo. Ho letto più esercitazioni, like this one, e non vedo cosa sto facendo in modo diverso per far sì che .add (ruolo) non funzioni correttamente.

Ho omesso qualche codice banale, se è necessario lo fornirò volentieri. Non ho fatto il codice per garantire che un GrantedRole con un riferimento a un utente sia referenziato da quell'utente in cambio, ma penso che non sia rilevante per il problema che sto avendo.

+0

1. I getter/setter sono davvero banali? 2. Lo stack completo di 'StackOverflowError' sarebbe di grande aiuto per capire cosa sta succedendo. –

+0

E puoi aggiungere il codice di entrambi i costruttori, 'User (String)' e 'GrantedRole (User, String)', in modo che possiamo capire esattamente cosa stai facendo. – eternay

+2

Potrebbe la chiamata ricorsiva del metodo 'toString()'. Dovresti assicurarti di non chiamare metodi come "equals", "hashCode", ... da child in parent, solo child dovrebbe essere interessato a chiamare da parent. –

risposta

15

Quindi, ero solo stupido e avevo una chiamata ricorsiva nei metodi toString(). User.toString() ha provato a stampare i ruoli e GrantedRole.toString() ha provato a stampare l'utente.

L'ho risolto modificando GrantedRole.toString() per stampare user.getUsername(), interrompendo così il ciclo.

+2

lo stesso può accadere con il tuo metodo .hashCode() :) –

+0

grazie, bella risposta – FAndrew

+1

Grazie, bloccato con questo problema di stackoverflow per più di un giorno per uno a uno bidirezionale.Risolto il problema modificando il tostring() –

Problemi correlati