Como devo mapear a seguinte situação Usando Annotations??
Tenho a seguintes Entidades que geram o meu banco através do Hibernate…
Classe Aluno
@Entity
public class Aluno {
@Id
@GeneratedValue
private int id_aluno;
private String nome;
private Integer idade;
//Como devo fazer o relacionamento aqui???
private Curso curso;
//get's e set's
}
Classe curso
@Entity
public class Curso {
@Id
@GeneratedValue
private int id_curso;
private String descricao;
//Como devo fazer o relacionamento aqui??
private Aluno aluno;
//get's e set's
}
agora o que quero fazer é cadastrar um aluno em um ou vários cursos
tendo em vista também que um curso pode conter vários alunos…
Tô viajando pra fazer esse mapeamento usando @ManyToOne, OneToMany e vice-versa…
Como o romarcio disse acima, oque você vai precisar fazer é um relacionamento Muitos-para-Muitos, a anotação que você terá que utilizar é a @ManyToMany, onde o hibernate irá criar uma tabela associativa no banco de dados para manipular esta associação.
No seu caso as entidades Aluno e Curso irão conter atributos compostos em forma de collection, assim você poderá navegar entre os registros:
@Entity
public class Aluno {
@Id
@GeneratedValue
private int id_aluno;
private String nome;
private Integer idade;
@ManyToMany
private Set<Curso> curso;
//get's e set's
}
@Entity
public class Curso {
@Id
@GeneratedValue
private int id_curso;
private String descricao;
@ManyToMany
private Set<Aluno> aluno;
//get's e set's
}
Na hora cadastrar um Aluno em um curso faço o seguinte, recupero os dados dele numa nova tela e tenho uma combo populada com todos os cursos disponíveis onde seleciono apenas um…
quando clico em salvar faço o seguinte:
public String salvarAlunoCurso(){
//cria a sessao com o banco e a transacao...
Session session = HibernateUtil.getSession();
Transaction t = session.beginTransaction();
try{
//se tudo der certo, salva no banco de dados
//salva o objeto curso e se der tudo certo comita a transacao
session.merge(aluno);
t.commit();
SessionUtil.addSuccessMessage("OperacaoSucesso");
//limpa formulario (objeto) aluno novas insercoes...
aluno = new Aluno();
}catch(Exception e){
//se ocorrer algo errado cancela a transacao
t.rollback();
SessionUtil.addErrorMessage("OperacaoFracasso");
}finally{
//fecha a sessao com o banco de dados
session.close();
}
return null;
}
Quando dou esse session.merge(aluno) ele num deveria atrelar o aluno ao curso selecionado na combo e gravar no banco, tendo em vista que já existe o relacionamento na minha entidade??
Deve ter alguma anotação do tipo inverse. Quando o mapeamento é feito por xml(como costumo usar) seria inverse=true.
Esse inverse deveria ser adicionado no @JoinColumn(…) eu acho, procurei sobre ele em anotações mas não encontrei nada, se não tiver esse atributo, tenta então com insertable=true, updatable=true