Master Detail vRaptor + Hibernate

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…

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…

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

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

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:

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:

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…

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

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

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:

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

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/

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) ...

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(); } }

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:

sim, mas vc tem que respeitar os nomes…

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

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

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

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

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