Olá, estou desenvolvendo uma aplicação com Struts2, Hibernate.
Mas estou com um problema que não consigo resolver, já busquei bastante na internet, mas não encontrei nenhuma resposta que me ajudasse.
Tenho 3 tabelas com relacionamento “N” para “N”, com 1 associativa.
Tabelas AVALIAÇÃO, MODULO e QUESTÃO , a tabela associativa AVALICAO_MODULO_QUESTAO tem três chaves primarias que também são foren key das outras três tabelas.
Como faço para mapear a coleção de questões referente a uma AVALIAÇÃO e um MODULO?
Se puderem me ajudar agradeço muito.
Para tentar ser mais claro, colocarei a imagem do relacionamento abaixo:
Onde desejo realizar um mapeamento através de Annotations do Hibernate, tentei fazer com o @ManyToMany ou @OneToMany, mas não tive sucesso. Sempre ocorre um erro dizendo que o joinColumns={} só aceita uma referência de ID quando dentro das referências do @JoinTable.
Se alguém tiver alguma sujestão.
Já me disseram para utilizar @EmbeddedId ou @IdClass, mas não descobri como utilizar no meu caso.
Desde já agradeço.
Olá… Para resolver este problema você terá que criar uma classe com chave composta é mais ou menos assim:
[code]
@Entity
@Table (name=“avaliacao_modulo”)
public class AvaliacaoModulo implements Serializable {
@Id
private AvaliacaoModuloId pk = new AvaliacaoModuloId();
// get e set
}
@Embeddable class AvaliacaoModuloId implements Serializable {
@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(name=“idavaliacao”)
private Avaliacao avaliacao;
@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(name="idmodulo")
private Modulo modulo;
@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(name="idquestao")
private Questao questao;
// get e set
}[/code]
marcossousa,
entendi que a classe com a chave composta fará a manipulação dos dados que eu realmente quero buscar.
Mas ainda não consegui entender qual eu farei essa chamada. Quando for escolher a Avaliação, como informarei o Módulo para retornar as questões corretas, sem qualquer duplicidade?
Teria um exemplo de como fazer a consulta?
Muito obrigado pela ajuda.
Não consigo fazer a busca fazendo referência dos dois “ids” de avaliação e modulo. Alguém pode me dar uma dica? Estou fazendo da seguinte forma!
@SuppressWarnings("unchecked")
public List<QuestaoBean> consultarAvaliacaoModuloId(AvaliacaoModulo
avaliacaoModulo) throws Exception {
Session sessao = HibernateUtil.getSessao();
List<QuestaoBean> lista = new ArrayList<QuestaoBean>();
lista = sessao.createCriteria(AvaliacaoModulo.class).add(Property
.forName("codigoAvaliacao").like(avaliacaoModulo.getPk().getAvaliacao()
.getCodigoAvaliacao())).add(Property
.forName("codigoModulo").like(avaliacaoModulo
.getPk().getModulo().getCodigoModulo()))
.list();
return lista;
}
Mas dá um erro dizendo que “AvaliacaoModulo” não tem “codigoAvaliacao”.
Como faço para fazer uma busca com “WHERE” ou “LIKE”
Agradeço desde já.