VRAPTOR: Como ele comporta com relacionamento N N com atributos
19 respostas
d34d_d3v1l
Galera,
como o VRaptor funcionaria com um Relacionamento N-N com atributo?
O atributo seria do tipo boolean e viria como default false.
Eu criei outro tópico para saber como que ele pegaria do multiselect o ids
e me ajudaram falando que era só colocar [] no name do componente.
Tudo aí beleza… Mas de acordo com um artigo que estava lendo sobre este tipo
de relcionamento no hibernate eu teria que criar duas classes a mais:
DepartamentoCurso
DepartamentoCursoPK
Onde a DepartamentoCursoPK iria contar o Departamento e o Curso…
e DepartamentoCurso iria conter um atributo do tipo DepartamentoCursoPK, e o boolean que eu preciso.
Para fazer um N-N com o Hibernate, você só precisa de duas listas nos seus modelos.
dai com o Vraptor, você popula as listas igualzinho o multiselect.
Você vai precisar de uma terceira tabela no banco de dados (não precisa criar uma classe para ela) onde será feito o relacionamento.
d34d_d3v1l
Rafael Guerreiro:
Para fazer um N-N com o Hibernate, você só precisa de duas listas nos seus modelos.
dai com o Vraptor, você popula as listas igualzinho o multiselect.
Você vai precisar de uma terceira tabela no banco de dados (não precisa criar uma classe para ela) onde será feito o relacionamento.
vlw pela resposta.
O relacionamento n-n ja esta funcionando.
O problema é n-n com atributos.
Vc leu o que eu postei?
Rafael_Guerreiro
¬¬
Lógico que eu li, você quer setar os atributos na view ou pegar ja setado?
Para setar na view: name=lista[0].atributo
para pegar setado do banco: this.session.get(id);
Rafael_Guerreiro
Você pode até registrar um converter no VRaptor que recebe seu dao e já faz o session.get(Long.parseLong(value));
Assim, você coloca no name: lista[0]
e passa só o id para a requisição, dai o ID vai cair no converter e o converter vai devolver a instancia toda preenchida para voce.
d34d_d3v1l
mas eu realmente teria q criar as outras duas classes né?
d34d_d3v1l
cara, vou explicar melhor.
to tentando imitir o email…
entao tenho classe
Mensagem
que possui N-N com:
Funcionario
Professor
Aluno
para mapear isto.
Só que eu tinha um atributo
boolean lida na classe mensagem.
Só agora q percebi que nao funcionaria, já que é uma mensagem compartilhada com varios destinatarios.
Por tanto o boolean lida deveria ser uma coluna de mensagens_do_“professor/aluno/funcionario”
…
Lembrando que na tabela TB_A_B você não precisa criar um modelo para ela e que as duas colunas (A_ID e B_ID) que ela vai ter não podem ser chaves e nem unique.
Correto? Agora quero saber, como que eu adiciono um atributo:
na entidade mensagens_do_professor???
Rafael_Guerreiro
Por que você não cria uma entidade email que vai receber o assunto, a mensagem (a classe mensagem relacionamento N emails para 1 mensagem) e um boolean lido ou não.
Então, cada pessoa recebe um email (relacionamento 1 pessoa para N emails).
Rafael_Guerreiro
Então, mas não precisa criar as classes, é só você receber a entidade na tela, mudar o que precisar mudar e fazer um merge no banco.
Faz assim:
Quando o cara abrir o e-mail você faz uma requisição ajax (está usando jquery?) passando o id do cara e o id da mensagem.
Lá você vai ter uma lógica que vai pegar esse id vindo da requisição e troca o boolean para true. e devolve http status 200 se der tudo certo.
Ou o seu problema é aonde colocar esse atributo lido? Se for esse, considera em criar aquela classe email que eu disse em cima.
d34d_d3v1l
Rafael Guerreiro:
Por que você não cria uma entidade email que vai receber o assunto, a mensagem (a classe mensagem relacionamento N emails para 1 mensagem) e um boolean lido ou não.
Então, cada pessoa recebe um email (relacionamento 1 pessoa para N emails).
Que ideia interessante.
Tipo assim:
@EntitypublicclassEmail{@IdprivateIntegerid;privateMensagemm;privatebooleanlido=false;//lista de professores, alunos e funcionarios}
Outra coisa… quando eu for fazer o save, eu vou ter que salvar tanto uma Mensagem tanto quanto um Email…
Como ficaria isto no vraptor?
public void save(Mensagem m, Email e){
Mensagem nova = mensagemDao.save(m);
e.setMensagem(nova);
emailDao.save(e);
}
tipo assim?
Rafael_Guerreiro
Não, cada e-mail vai ter 1 pessoa, ou seja, um email é do professor e outro é do aluno, ids diferentes, mas a mesma mensagem.
Olha lá o relacionamento que eu falei: N Emails para 1 Mensagem e 1 pessoa para N emails.
Para salvar tudo junto, dentro de e-mail:
@EntitypublicclassEmail{@IdprivateIntegerid;@ManyToOne(cascade=CascadeType.ALL)// Ou seja, remove a mensagem (se não tiver mais ninguem usando) quando este email for removido. Salva a mensagem quando o email for salvo, altera a mensagem quando o email for alterado. (assim você usa o dao só de email. só um session.save(email) já vai salvar a mensagem dentro dele)privateMensagemm;privatebooleanlido=false;//lista de pessoa (superclasse de professor, aluno e funcionário)}
d34d_d3v1l
Rafael Guerreiro:
Não, cada e-mail vai ter 1 pessoa, ou seja, um email é do professor e outro é do aluno, ids diferentes, mas a mesma mensagem.
Olha lá o relacionamento que eu falei: N Emails para 1 Mensagem e 1 pessoa para N emails.
Se for N para 1 pessoa aí complicou…
pq tipo não uso herença nas entidades.
Teria q fazer 3 entidades diferentes?
EmailProfessor
EmailAluno
EmailFuncionario?
pq aí
EmailProfessor
ManyToOne Professor professor
Mensagem mensagem
Professor
OneToMany
List<Email>
Rafael_Guerreiro
Até pode fazer. Mas fica feio demais.
Me mostra as 3 entidades (professor, funcionario e aluno) para eu ver.
Este projeto já peguei em andamento. :(
Tenho que implementar o sistema de mensagens...
Qndo tava tudo pronto..percebi que havia colocado o Boolean lida como
atributo de "Mensagem". Assim se eu tiver 10 destinatários e 1 deles ler a mensagem,
vai aparecer para todos os outros 9, que a mensagem ja foi lida. :(
Me ajuda a esboçar as classes usando a solução que vc propos?
Rafael_Guerreiro
A minha ideia era voce ter 1 classe só chamada Pessoa.
E dentro dela você teria uma ENUM com os tipos de Pessoa:
publicclassPessoa{privateLongid;privateStringname;privateList<Email>emails;@Enumerated(EnumType.STRING)// Salva o .name() da enum@Enumerated(EnumType.ORDINAL)// Salva o .ordinal() da enumprivateTipoPessoatipo;}publicenumTipoPessoa{PROFESSOR,ALUNO,FUNCIONARIO}