Hibernate many to many

1 resposta
O

Boa tarde galera. Estou fazendo um exemplo de hibernate e me surgiu uma duvida.
Tenho uma classe Turma que contem um relacionamento many to many, entre a classe Aluno. E essa classe Turma tambem tem um relacionamento many to one com a classe Professor e a classe Disciplina. Vixiii…
Dae apareceu a duvida.
Como é feito o processo de persistencia entre as classes? Sendo que na classe Aluno eu tenho como propriedade um Set<Turma> e na classe Turma eu tenho como propriedade um Set<Aluno> e mais ainda a classe Turma tbem possui como propriedade as classe Professor e Disciplina.
Codigo abaixo.

package br.com.mgf.modelo;

import java.io.Serializable;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "Aluno")
public class Aluno extends Pessoa implements Serializable {
	
	private String matricula;
	private Set<Turma> turmas;
	
	@Column(name = "matricula", length = 10)
	public String getMatricula() {
		return matricula;
	}

	public void setMatricula(String matricula) {
		this.matricula = matricula;
	}
	
	@ManyToMany( cascade = {CascadeType.PERSIST, CascadeType.MERGE}, 
			mappedBy = "alunos", 
			targetEntity = br.com.mgf.modelo.Turma.class )
	public Set<Turma> getTurmas() {
		return turmas;
	}

	public void setTurmas(Set<Turma> turmas) {
		this.turmas = turmas;
	}
	

}

A classe Turma

package br.com.mgf.modelo;

import java.io.Serializable;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "Turma")
public class Turma implements Serializable {
	
	private Long idTurma;
	private String nomeTurma;
	private Set<Aluno> alunos;
	private Professor professor;
	private Disciplina disciplina;
	
	@ManyToOne
	@JoinColumn(name = "idDisciplinaFk")
	public Disciplina getDisciplina() {
		return disciplina;
	}
	public void setDisciplina(Disciplina disciplina) {
		this.disciplina = disciplina;
	}
	@ManyToOne
	@JoinColumn(name = "idProfessorFk")
	public Professor getProfessor() {
		return professor;
	}
	public void setProfessor(Professor professor) {
		this.professor = professor;
	}
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public Long getIdTurma() {
		return idTurma;
	}
	public void setIdTurma(Long idTurma) {
		this.idTurma = idTurma;
	}
	
	@Column(name = "nomeTurma", length = 20)
	public String getNomeTurma() {
		return nomeTurma;
	}
	
	public void setNomeTurma(String nomeTurma) {
		this.nomeTurma = nomeTurma;
	}
	
	@ManyToMany(targetEntity = br.com.mgf.modelo.Aluno.class, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
	@JoinTable(name = "TurmaAluno",
			joinColumns = {@JoinColumn(name = "idTurmaFk")}, inverseJoinColumns = {@JoinColumn(name="idAlunoFk")})
	public Set<Aluno> getAlunos() {
		return alunos;
	}
	public void setAlunos(Set<Aluno> alunos) {
		this.alunos = alunos;
	}
	

}

Disciplina

package br.com.mgf.modelo;

import java.io.Serializable;
import java.util.Set;

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


@Entity
@Table(name = "Disciplina")
public class Disciplina implements Serializable {
	
	private Long idDisciplina;
	private String nomeDisciplina;
	private String ementa;
	private Curso curso;
	private Set<Turma> turmas;
	
	
	@ManyToOne
	@JoinColumn(name = "idCursoFk")
	public Curso getCurso() {
		return curso;
	}
	public void setCurso(Curso curso) {
		this.curso = curso;
	}
	
	@Column(name = "ementa", length = 15)
	public String getEmenta() {
		return ementa;
	}
	public void setEmenta(String ementa) {
		this.ementa = ementa;
	}
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public Long getIdDisciplina() {
		return idDisciplina;
	}
	public void setIdDisciplina(Long idDisciplina) {
		this.idDisciplina = idDisciplina;
	}
	
	@Column(name = "nomeDisciplina", length = 25)
	public String getNomeDisciplina() {
		return nomeDisciplina;
	}
	public void setNomeDisciplina(String nomeDisciplina) {
		this.nomeDisciplina = nomeDisciplina;
	}
	
	@OneToMany(mappedBy = "disciplina")
	public Set<Turma> getTurmas() {
		return turmas;
	}
	public void setTurmas(Set<Turma> turmas) {
		this.turmas = turmas;
	}
	

}

Professor

package br.com.mgf.modelo;

import java.io.Serializable;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;

@Entity
@Table(name = "Professor")
public class Professor extends Pessoa implements Serializable {
	
	private String graduacao;
	private Set<Turma> turmas;
	
	@Column(name = "graduacao")
	public String getGraduacao() {
		return graduacao;
	}

	public void setGraduacao(String graduacao) {
		this.graduacao = graduacao;
	}
	
	@OneToMany(mappedBy = "professor")
	public Set<Turma> getTurmas() {
		return turmas;
	}

	public void setTurmas(Set<Turma> turmas) {
		this.turmas = turmas;
	}
	

}

Se estiver errado por favor me corrijam.
Eu acho que é assim. Como em todos os relacionamento bidirecionais tem que ter uma ponta responsavel pelo relacionamento, a classe Turma é a responsavel pelo relacionamento entre a classe Disciplina atravez do codigo

@ManyToOne
	@JoinColumn(name = "idDisciplinaFk")
	public Disciplina getDisciplina() {
		return disciplina;
	}

Tambem é responsavel pelo relacionamento entre a classe Professor:

@ManyToOne
	@JoinColumn(name = "idProfessorFk")
	public Professor getProfessor() {
		return professor;
	}

E pela classe Aluno que tem many to many

@ManyToMany(targetEntity = br.com.mgf.modelo.Aluno.class, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
	@JoinTable(name = "TurmaAluno",
			joinColumns = {@JoinColumn(name = "idTurmaFk")}, inverseJoinColumns = {@JoinColumn(name="idAlunoFk")})
	public Set<Aluno> getAlunos() {
		return alunos;
	}

Como a classe Turma possui CascadeType = PERSIST e MERGE, quando eu der save(turma) todos os relacionamentos serao persistidos?

Obrigado pela colaboracao e me desculpem pelo codigo em excesso…

1 Resposta

O

Sera que alguem pode me ajudar…?
Obrigado e desculpe pela inpaciência, meu chefe ta me precionando aqui…

Criado 30 de julho de 2007
Ultima resposta 30 de jul. de 2007
Respostas 1
Participantes 1