Eu tentei criar uma tabela para associar os ID de perguntas e respostas mas durante a apresentação, os dados vieram todos com problemas, imaginei que deveria fazer alguma configuração de sobre relacionamento no hbm.xml, e apesar d ter visto alguns exemplos ainda não obtive sucesso.
Alguém poderia mostrar como devo fazer esta configuração?
Primeiro, vc está mapeando os dois xmls para a mesma tabela (pergunta)!!!
Outra questão é se a sua pergunta pode possuir diversas respostas e se sua resposta pode pertencer a mais de uma pergunta, se for verdade temos uma situação many-to-many (aparentemente, esse é o caso, já q vc criou uma tabela de vínculo). Para essas situações vc pode por uma coleção na Pergunta para pegar as respostas vinculadas, para isso vc pode adicionar o seguinte ao seu mapeamento da pergunta (ou uma das variações que vc pode olhar na documentação):
Vc coloca um Set de respostas na classe Pergunta… Ok… dai vc cria o get e o set normalmente para o Set de respostas:
private Set respostas;
public Set getRespostas() {
return respostas;
}
public void setRespostas(Set resp) {
this.respostas = resp;
}
Ai vc coloca aquele esquema no mapeamento da Pergunta…
Ao fazer o load ele irá carregar as respostas para vc automaticamente!!!
Mais ou menos isso, tlvz tenha que fazer uns ajustes, mas é por aí!!!
TedLoprao, tentei seguir suas orientações mas não obtive sucesso cara.
Eu só mudei um pouco o escopo, pois agora estou tentando fazer um relacionamento de one-to-many. As tabelas no banco de dados estão criadas e devidamente relacionadas.
Abaixo vou colocar o erro e o meu fonte.
Erro retornado pelo tomcat
INFO: processing one-to-many association mappings
net.sf.hibernate.MappingException: Association references unmapped class: br.com
.tutorialfmu.questionario.PerguntaBean
at net.sf.hibernate.cfg.Binder.bindCollectionSecondPass(Binder.java:1162
)
at net.sf.hibernate.cfg.Binder$CollectionSecondPass.secondPass(Binder.ja
va:1366)
at net.sf.hibernate.cfg.Binder$SecondPass.doSecondPass(Binder.java:1342)
at net.sf.hibernate.cfg.Configuration.secondPassCompile(Configuration.ja
va:618)
at net.sf.hibernate.cfg.Configuration.buildSessionFactory(Configuration.
java:761)
at br.com.tutorialfmu.questionario.MateriaDAO.<init>(MateriaDAO.java:13)
at br.com.tutorialfmu.aluno.AlunoController.doGet(AlunoController.java:6
9)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:284)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:204)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
alve.java:257)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
eContext.java:151)
MateriaBean.java
package br.com.tutorialfmu.questionario;
import java.io.Serializable;
import java.util.Set;
public class MateriaBean implements Serializable {
private int id;
private String nome;
private Set pergunta;
public MateriaBean() {}
public int getId() {
return id;
}
public int setId(int id) {
return this.id = id;
}
public String getNome() {
return nome;
}
public String setNome(String nome) {
return this.nome = nome;
}
public void setPergunta(Set pergunta) {
this.pergunta = pergunta;
}
public Set getPergunta() {
return pergunta;
}
}
PerguntaBean.java
package br.com.tutorialfmu.questionario;
import java.io.Serializable;
public class PerguntaBean implements Serializable {
private int id;
private String pergunta;
private String imagem;
private String tipo;
private boolean respondida = false;
private boolean correta = false;
public PerguntaBean() {}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setPergunta(String pergunta) {
this.pergunta = pergunta;
}
public String getPergunta(){
return pergunta;
}
public void setImagem(String imagem) {
this.imagem = imagem;
}
public String getImagem() {
return imagem;
}
public void setTipo(String tipo) {
this.tipo = tipo;
}
public void setRespondida(boolean respondida) {
this.respondida = respondida;
}
public boolean getRespondida() {
return respondida;
}
public void setCorreta(boolean correta) {
this.correta = correta;
}
public boolean getCorreta() {
return correta;
}
}
Desculpa a minha ignorância, hehehe. Mas eu desconheço esse mapeamento que vc esta dizendo.
Sobre a localização dos arquivos eu fiz o seguinte: Tanto a classe quanto o hbm eu deixei no mesmo diretório e sempre me pareceu suficiente isso pq antes de tentar relacionar as tabelas eu consegui fazer persistência de uma tabela.
Ai é que está o problema… Se vc acessar o da Materia ele só vai carregar o mapeamento da MateriaBean e não o do PerguntaBean…
Outra coisa, essa configuração devia ocorrer uma vez para o seu sistema e deveria existir uma SessionFactory apenas…
Pense no seguinte, agora vc está carregando um mapeamento por vez, mas se vc carregar uma estrutura muito complexa (no seu exemplo vc tem dois mapeamentos para carregar), com um grande grafo de objetos, sempre que vc criar o DAO ele irá carregar todos esses mapeamentos de novo e isso ficará bastante lento…
Talvez o melhor fosse carregar em um Singleton ou algo assim, fazendo toda a configuração de uma vez, mas apenas uma vez!!!
É verdade, eu vi isso na documentação do hibernate, depois vou fazer estas alterações.
Mas o seguinte, para que eu consiga fazer carregar as perguntas de uma determinada matéria, eu apenas devo acrescentar mais uma linha no meu contrutor, assim:
TedLoprao, testei e funcionou, parou de exibir a mensagem de erro! Porém…porém…porém aconteceu algo muito estranho e não sei dizer se o hibernate tem culpa nisso, veja só:
Vamos dizer que tenha uma linha no banco de dados com o valor
o que é lógica
A saída no meu browser fica
o que ??ca?
Porém se eu não acentuar a saída da String é correta. Tem alguma coisa a ser configurada ainda?
Obs.: Para exibir eu populo uma List e passo por Sessão e exibo em uma JSP.
Hmmm, isso é problema de encoding… Tem várias mensagens sobre isso aqui no guj!!! De repente tu encontre alguma solução… Realmente eu nunca tive esse problema e não saberia te ajudar!!
Já tive um ótimo progresso com sua ajuda!
Tenho certeza q vou errar ainda um pouco no uso do hibernate pq é um pouco diferente de se trabalhar, mas é assim mesmo quando se está aprendendo!