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…