Boa tarde,
Tenho duas classes: Professor e Disciplina.
Estas classes são transformadas em tabelas correspondentes pelo hibernate.
Sendo o relacionamento das tabelas correspondentes no hibernate NXM, é criada a tabela não mapeada professor_disciplina a partir da classe Professor:
@ManyToMany
@JoinTable(name = "PROFESSOR_DISCIPLINA", joinColumns = { @JoinColumn(name = "PROFESSOR_ID", referencedColumnName = "ID") }, inverseJoinColumns = { @JoinColumn(name = "DISCIPLINA_ID", referencedColumnName = "ID") })
private Set<Disciplina> disciplinas = new HashSet<Disciplina>();
Preciso então saber como faço para consultar esta tabela (professor_disciplina) num select via hibernate (named query, de preferência).
Grato pela atenção.
Cara, faz tempo que nao trampo com Hibernate a nivel de Mapeamento, mas… Porque nao mapear a Tabela Professor_Disciplina ?? 8)
Primeiro, porque não acho interessante transformá-la numa classe.
Segundo, porque estruturalmente, eu precisaria fazer o respectivo repositório, dao, etc. (Ou seja, preguiça).
Mas estruturalmente não seria bom, mesmo.
Bacana, mas esse mapeamento é xml, e como pode ver, estou usando anotações.
Eu não costumo usar anotações, testei pelo gerador do netbeans o exemplo que te passei acima.
Ficou assim:
Tabela Foo
...
@JoinTable(name = "foo_bar", joinColumns = {@JoinColumn(name = "foo_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "bar_id", referencedColumnName = "id")})
@ManyToMany
private Collection<Bar> barCollection;
...
Tabela Bar
@ManyToMany(mappedBy = "barCollection")
private Collection<Foo> fooCollection;
Não entendi muito bem pq na tabela Bar não foi gerado o relacionamento como na tabela Foo. Mas vc pode testar esse mapeamento ou então utilizar alguma IDE para gerar pra vc.
Muito obrigado pela sua resposta, romarcio, mas este caso é para uma associação bidirecional entre classes, note que a anotação da classe (ou tablela) Foo é exatamente o que postei que consta na classe Professor.
A diferença é que esta é uma associação unidirecional, ou seja, apenas a classe Professor pode conhecer a classe Disciplina, mas não o contrário.
Segundo o que você me passou, a tabela está sim sendo mapeada no hibernate, logo, eu estou consultando errado.
Minha consulta é a segunite:
@NamedQuery(name = "GradeDisponibilidade.obterProfessoresDisponibilizados",
query = "SELECT DISTINCT p FROM Professor p, PROFESSOR_DISCIPLINA pd " +
"WHERE pd.professor.id = p.id AND pd.disciplina.id = :disciplinaParam")
Sei que o hibernate só encontra classes pelo hql e a classe PROFESSOR_DISCIPLINA não existe no projeto.
Mas, então como devo consultar?
Mais uma vez, agradeço a atenção.
EDIT: Consegui!!! Era isso mesmo, a consulta estava errada. A correta seria o seguinte:
@NamedQuery(name = "GradeDisponibilidade.obterProfessoresDisponibilizados",
query = "SELECT DISTINCT p FROM Professor p " +
" WHERE p.disciplinas.id = :disciplinaParam")
Muitíssimo obrigado ao romarcio.
Mapemento essa entidade é Instituicao
[code]
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name="Instituicao_professor",joinColumns={@JoinColumn(name="identificador") }
,inverseJoinColumns={@JoinColumn(name = "cpfMatricula")})
@Cascade(CascadeType.ALL)
private Collection<Professor> professores;[/code]
Mapeamento entidade professor.
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "Instituicao_professor", joinColumns = { @JoinColumn(name = "cpfMatricula") },
inverseJoinColumns = { @JoinColumn(name = "identificador") })
private Collection<Instituicao> instituicoes;