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.
1. I getter/setter sono davvero banali? 2. Lo stack completo di 'StackOverflowError' sarebbe di grande aiuto per capire cosa sta succedendo. –
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
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. –