java.lang.StackOverflowError

Estou tentando criar um listarAlunos usando java JPA Hibernate, mas no momento que eu escrevo algo no banco, ele simplesmente da erro… Alguem pode me ajudar?

Erro -
java.lang.StackOverflowError
java.lang.AbstractStringBuilder.append(Unknown Source)
java.lang.StringBuilder.append(Unknown Source)
java.sql.Time.toString(Unknown Source)
java.lang.String.valueOf(Unknown Source)
java.lang.StringBuilder.append(Unknown Source)
dominio.Turma.toString(Turma.java:122)
java.lang.String.valueOf(Unknown Source)
java.lang.StringBuilder.append(Unknown Source)
dominio.Aluno.toString(Aluno.java:186)
java.lang.String.valueOf(Unknown Source)
java.lang.StringBuilder.append(Unknown Source)
java.util.AbstractCollection.toString(Unknown Source)

Classe Aluno -

package dominio;

import java.sql.Date;
import java.util.Arrays;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = “tab_alunos”)
public class Aluno {

@Id
private Integer matricula;

@Column(nullable = false)
private String nome;
private String telefone;
private String endereco;
private String historico;

private Integer idade;

private Integer faltas;

private Date dataInsc, dataSaida;

@ManyToOne 
@JoinColumn(name = "id_turma_fk")
private Turma turma;

@OneToMany (mappedBy="aluno", fetch=FetchType.LAZY)
private List<Nota> notas;



public Integer getMatricula() {
	return matricula;
}



public void setMatricula(Integer matricula) {
	this.matricula = matricula;
}



public String getNome() {
	return nome;
}



public void setNome(String nome) {
	this.nome = nome;
}



public String getTelefone() {
	return telefone;
}



public void setTelefone(String telefone) {
	this.telefone = telefone;
}



public String getEndereco() {
	return endereco;
}



public void setEndereco(String endereco) {
	this.endereco = endereco;
}



public String getHistorico() {
	return historico;
}



public void setHistorico(String historico) {
	this.historico = historico;
}



public Integer getIdade() {
	return idade;
}



public void setIdade(Integer idade) {
	this.idade = idade;
}



public Integer getFaltas() {
	return faltas;
}



public void setFaltas(Integer faltas) {
	this.faltas = faltas;
}



public Date getDataInsc() {
	return dataInsc;
}



public void setDataInsc(Date dataInsc) {
	this.dataInsc = dataInsc;
}



public Date getDataSaida() {
	return dataSaida;
}



public void setDataSaida(Date dataSaida) {
	this.dataSaida = dataSaida;
}



public Turma getTurma() {
	return turma;
}



public void setTurma(Turma turma) {
	this.turma = turma;
}



public List<Nota> getNotas() {
	return notas;
}



public void setNotas(List<Nota> notas) {
	this.notas = notas;
}



@Override
public String toString() {
	return "Aluno [matricula=" + matricula + ", nome=" + nome + ", telefone=" + telefone + ", endereco=" + endereco
			+ ", historico=" + historico + ", idade=" + idade + ", faltas=" + faltas + ", dataInsc=" + dataInsc
			+ ", dataSaida=" + dataSaida + ", turma=" + turma + ", notas=" + notas + "]";
}



@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	Aluno other = (Aluno) obj;
	if (matricula == null) {
		if (other.matricula != null)
			return false;
	} else if (!matricula.equals(other.matricula))
		return false;
	return true;
}

}

Classe Turma -
package dominio;

import java.sql.Time;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = “tab_turmas”)
public class Turma {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ID_TURMA")
@SequenceGenerator(name = "ID_TURMA", sequenceName = "SEQ_TURMA", allocationSize = 1)
private String idTurma;

@Column(nullable = false)
private Time horaInicio, horaFim, horaIntervalo;
private Integer qtdHoraTotal;

@OneToMany(mappedBy = "turma", fetch = FetchType.LAZY)
private List<Aluno> alunos;

@ManyToMany(mappedBy = "turma")
private List<Disciplina> disciplinas;

@ManyToOne
@JoinColumn(name = "id_sala_fk")
private Sala sala;

@ManyToOne
@JoinColumn(name = "id_professor_fk")
private Professor professor;

public String getIdTurma() {
	return idTurma;
}

public void setIdTurma(String idTurma) {
	this.idTurma = idTurma;
}

public Time getHoraInicio() {
	return horaInicio;
}

public void setHoraInicio(Time horaInicio) {
	this.horaInicio = horaInicio;
}

public Time getHoraFim() {
	return horaFim;
}

public void setHoraFim(Time horaFim) {
	this.horaFim = horaFim;
}

public Time getHoraIntervalo() {
	return horaIntervalo;
}

public void setHoraIntervalo(Time horaIntervalo) {
	this.horaIntervalo = horaIntervalo;
}

public Integer getQtdHoraTotal() {
	return qtdHoraTotal;
}

public void setQtdHoraTotal(Integer qtdHoraTotal) {
	this.qtdHoraTotal = qtdHoraTotal;
}

public List<Aluno> getAlunos() {
	return alunos;
}

public void setAlunos(List<Aluno> alunos) {
	this.alunos = alunos;
}

public List<Disciplina> getDisciplinas() {
	return disciplinas;
}

public void setDisciplinas(List<Disciplina> disciplinas) {
	this.disciplinas = disciplinas;
}

public Sala getSala() {
	return sala;
}

public void setSala(Sala sala) {
	this.sala = sala;
}

public Professor getProfessor() {
	return professor;
}

public void setProfessor(Professor professor) {
	this.professor = professor;
}

@Override
public String toString() {
	return "Turma [idTurma=" + idTurma + ", horaInicio=" + horaInicio + ", horaFim=" + horaFim + ", horaIntervalo="
			+ horaIntervalo + ", qtdHoraTotal=" + qtdHoraTotal + ", alunos)=" + alunos + ", disciplinas="
			+ disciplinas + ", sala=" + sala + ", professor=" + professor + "]";
}

@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	Turma other = (Turma) obj;
	if (idTurma == null) {
		if (other.idTurma != null)
			return false;
	} else if (!idTurma.equals(other.idTurma))
		return false;
	return true;
}

}

Cara, o problema acontece nos métodos toString() das suas classes Aluno e Turma. No mapeamento que você fez, você tem uma referência circular: Aluno -> Turma e Turma -> List. Como você incluiu essas referências no método toString(), ao tentar concatenar as referências de Aluno e Turma o programa entra numa espécie de loop infinito, veja:

aluno.toString()
  turma.toString()
    aluno.toString()
      turma.toString()

e assim por diante. O que você precisa fazer é em um dos métodos toString() remover a referência circular, por exemplo. não incluir a lista de alunos no método toString() de Turma.

1 curtida

Obrigada!