Master Detail vRaptor + Hibernate

20 respostas
kivervinicius

Olá novamente, eu gostaria de saber qual a melhor maneira de master detail utilizando estes 2 frameworks,

por exemplo, eu possuo uma classe acervo e uma exemplar, a exemplar precisa do vinculo do acervo, já possuo o cadastro do exemplar agora depois do metodo adiciona eu redireciono para o formulario do exemplar, pois o mesmo já entra cadastrando, a maior duvida é, como passar o codigo do acervo corrente para o formulario do exemplar, para mim o correto seria passar para um input hidden…

não sei se fui “intendivel”, procurei no forum e não encontrei algo relacionado.

ps: vRaptor é o meu primeiro contato com java (ee, tanto desktop), imagino q a parte master detail seja similar para outras plataformas e frameworks…

obrigado…

20 Respostas

Lucas_Cavalcanti

no vraptor vc vai fazer algo do tipo:

  • no controller vc adiciona o acervo na lógica do formulário:
public void formulario(Acervo acervo) {
    result.include("acervo", acervo);
}
  • no formulario do jsp vc vai fazer algo do tipo:
<form ....>
   <input type="hidden" name="exemplar.acervo.id" value="${acervo.id}" />
   ...
</form>

supondo que vc tem um campo Acervo acervo no seu Exemplar…

kivervinicius

Sim sim, possuo os campos corretamente, mas se eu fizer o include como que o vraptor vai saber que aquele acervo é o que eu estou solicitando? rs, vlw

Lucas_Cavalcanti

vc passa como parametro na requisição o id do acervo que vc quer adicionar exemplares…

ou passando um parametro ?acervo.id=234 na url, ou colocando na propria uri do formulario:

@Path("/acervo/{acervo.id}/novoExemplar")
public void formulario(Acervo acervo) {...}

e chamando a uri /acervo/234/novoExemplar

kivervinicius

Desculpa Lucas, dessa vez não entendi,

Eu queria assim, o usuario cadastra o acervo, ele eh redirecionado para o adiciona, o adiciona fala para o usuario que foi adicionado com sucesso, em seguida, pergunta se deseja cadastrar o exemplar para o acervo, caso clica em sim, ele deveria redirecionar para o formulario do exemplar no meu caso isso

http://localhost:8080/Biblioteca/exemplar/formulario

mas como passar para essa url o ?acervo_id= se o formulario já passou e o id já não existe (pois estou no adiciona.jsp), e como vou fazer para no meu formulario do exemplar pegar o valor da url lah em cima? tipo no php eu usaria um $_get[acervo_id] mas no vraptor estou totalmente perdido, mesmo com a explicação q vc meu deu fiquei com um nó na cabeça :oops:

kivervinicius

e tipo quando eu quiser listar um exemplar eu soh posso listar tudo que for do acervo tal no critéria deste listaTudo eu terei que ter tbm o filtro do acervo,

pensei em atributo static, é gambiarra?

aiai dessa vez me enrosquei… :roll:

Lucas_Cavalcanti

sem atributos static, vc não precisa deles!

você tem o método adiciona do acervo certo? ele tem algo assim, provavelmente:

public void adiciona(Acervo acervo) {
    //validações
    dao.adiciona(acervo); //agora o acervo tem id!
    result.include("acervo", acervo); //daí vc pode incluir no result
}

então no adiciona.jsp, no link pro formulario:

<a href="/Biblioteca/exemplar/formulario?acervo.id=${acervo.id}">Novo exemplar</a>

e o método formulario do ExemplarController vc faz do jeito que eu falei no outro tópico:

public void formulario(Acervo acervo) {..}

o vraptor vai popular o parametro pra vc sem problemas…

kivervinicius

hmmmmm blza lucas, vlw por tudo, deu certo, soh vou ter q implementar agora como fazer no lista tudo para filtrar o acervo, obrigado, não sabia que era simples dessa forma, obrigado

Pretendo postar tutoriais no meu blog futuramente passo a passo de como fazer um sistema usando vRaptor caso não houver problema rsr,

[]`s

kivervinicius

Lucas, como faço para listar nos exemplares somente os que tem o acervo tal…

@SuppressWarnings("unchecked") public List<Exemplar> listaPorAcervo(Long id) { return this.session.createCriteria(Exemplar.class).add(Restrictions.eq("acervo", id)).list(); }

eu fiz assim mas ele da o erro

java.lang.Error: Unresolved compilation problem:
The method listaPorAcervo(Long) in the type ExemplarDao is not applicable for the arguments ()

que não é do tipo, blz então o certo seria assim?

@SuppressWarnings("unchecked") public List<Exemplar> listaPorAcervo(Long id) { Acervo acervo = new Acervo(); acervo = (Acervo) this.session.load(Acervo.class, id); if (acervo != null) { return this.session.createCriteria(Exemplar.class).add( Restrictions.eq("acervo", acervo)).list(); } else { return this.session.createCriteria(Exemplar.class).list(); } }

agora da erro assim.

java.lang.Error: Unresolved compilation problem:
The method listaPorAcervo(Long) in the type ExemplarDao is not applicable for the arguments (Acervo)

Tipo argumento inváido?

Como faço para passar o acervo q eu selecionei? como passar ao lista o acervo.id

kivervinicius

Lucas será que possue em algum lugar essa parte de passagem de parametros, eu entendi mais ow menos no master detail, mas vou precisar utilizar isso em vários lugares e não qro ficar incomodando sempre… tipo no lista o certo seria passar o parametro para ele e o vraptor entender e passar para o meu critéria,mas até agora não consegui fazer… :oops:

kivervinicius

poxa passei vergonha agora. kkkk

consegui fazer, por isso não achava nada sobre passagem de parametro o vraptor já o faz sozinho…

ficou assim

metodo Lista
Controller

public List<Exemplar> lista(Long acervo) { return dao.listaPorAcervo(acervo); }

e no Dao

@SuppressWarnings("unchecked") public List<Exemplar> listaPorAcervo(Long id) { AcervoDao acervodao = new AcervoDao(); if (id != null) { //verifico se foi passado o id return this.session.createCriteria(Exemplar.class).add( Restrictions.eq("acervo", acervodao.carrega(id))).list(); } else { //se não retorno tudo. return this.session.createCriteria(Exemplar.class).list(); } }

Está funcionando, não sei se é da forma correta, se não for me corrijam por favor

Lucas_Cavalcanti

java.lang.Error: Unresolved compilation problem:
The method listaPorAcervo(Long) in the type ExemplarDao is not applicable for the arguments (Acervo)

qual eh o código que está chamando o ExemplarDao?
o erro está nesse código…

vc pode ver a doc do vraptor em:
http://vraptor.caelum.com.br/documentacao

e na apostila do FJ-28 da caelum:
http://www.caelum.com.br/curso/fj-28-vraptor-hibernate-ajax/

Lucas_Cavalcanti

de qqer forma, não use criteria nesse caso… é mais fácil fazer:

public List<Exemplar> listaPorAcervo(Long id) {
     return session.createQuery("from Exemplar e where e.acervo.id = :id")
              .setParameter("id", id)
              .list();
}

se vc quiser ainda usar criteria, vc não precisa carregar o Acervo do banco, vc só precisa passar um acervo com o id setado:

Acervo acervo = new Acervo();
acervo.setId(id);
.... Restrictions.eq("acervo", acervo) ...
kivervinicius

ah sim, verdade lucas, assim eu não necessito passar o load, muito menos criar o objeto acervoDao

ficou assim então

@SuppressWarnings("unchecked") public List<Exemplar> listaPorAcervo(Long id) { if (id != null) { return session.createQuery( "from Exemplar e where e.acervo.id = :id").setParameter( "id", id).list(); } else { return this.session.createCriteria(Exemplar.class).list(); } }

kivervinicius

De qualquer forma lucas, deixa ver se eu entendi, qualquer parametro que eu passar em um método controler, através da jsp se eu passar ele na url o vraptor entende?

abraçao…

se for assim tá otimo :smiley:

Lucas_Cavalcanti

sim, mas vc tem que respeitar os nomes…

mais info:
http://vraptor.caelum.com.br/documentacao/resources-rest/

kivervinicius

blz Lucas, agora sim entendi perfeitamente, cada vez me admiro mais com o poder do vRaptor, desculpe por tantas perguntas constantes, mas acho que acabo contribuindo para isso, kkk, pois muitos caem aqui pelo google, com perguntas parecidas com as minhas, prova disso um colega meu que estava precisando da mesma coisa e encontrou pelo google… rsr, por isso acho que seria muito bom ter tutoriais de rotinas básicas que um sistema deve ter

(Login,Validação, formularios simples, master details, integração com tag libs)

somente uma opnião, pena que não tenho tanto conhecimento para fazer, mas se alguem pudesse disponbilizar isso seria ótimo, porque por mais que a documentação seja super bem explicada, muitos entendem mais por "algo que se possa ver "

Mais uma vez obrigado a todos do Guj.

[]'s

Lucas_Cavalcanti

tem um sisteminha básico na apostila do fj-28 com várias dessas coisas que vc falou

kivervinicius

sim sim, verdade esqueci, vlw, abração

G

Tem também o livro de receitas, que você mesmo pode contribuir conforme for achando “coisas interessantes que todos deveriam saber”.

kivervinicius

Opa, isso é muito bom, terminando esse projeto da faculdade, estarei me esforçando mais com o java e o vraptor, o que eu acho que faltava mesmo, era uma técnica de autenticação simples, pois todas que encontrei são um pouco complexas e dificeis de entender, no meu projeto nem login terá por falta de tempo =/

Criado 16 de junho de 2010
Ultima resposta 17 de jun. de 2010
Respostas 20
Participantes 3