| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/01/2008 18:53:46
|
guigouz
Debugger
Membro desde: 19/09/2006 23:08:34
Mensagens: 66
Offline
|
Fala... to precisando implementar uma tabela com hierarquia no java. Basicamente é uma tabela que referencia ela mesma.. tem um artigo muito bom explicando a teoria em http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
A questão é: alguém tem idéia se é possível tal implementação com JPA, ou devo continuar no caminho do JDBC com SQL direto?
Abraço
gui
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/01/2008 20:08:23
|
henrique.lima
Thread.start()
![[Avatar]](/images/avatar/614484a1c3d62905498f756ee2a85010.jpg)
Membro desde: 20/12/2007 09:48:19
Mensagens: 26
Offline
|
Olá guigous, é possível efetuar este tipo de relacionamento em JPA, abaixo segue um trecho de código:
É válido lembrar que para que o JPA insira os registros corretamente no banco, o relacionamento deve estar explícito e por isso é recomendável utilizar um método (neste caso o método addCategoria) para efetuar este relacionamento.
Espero que tenha ajudado.
Boa sorte!
This message was edited 1 time. Last update was at 10/01/2008 20:09:07
|
visite e contribua no Submundojava - Certificação Java, Java Server Faces, RichFaces e muito mais. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/01/2008 00:07:35
|
guigouz
Debugger
Membro desde: 19/09/2006 23:08:34
Mensagens: 66
Offline
|
Funcionou perfeito. Achei que fosse bem mais complexo que isso.
Sabe dizer se essas queries são otimizadas ?
Valeu
gui
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/01/2008 19:33:01
|
henrique.lima
Thread.start()
![[Avatar]](/images/avatar/614484a1c3d62905498f756ee2a85010.jpg)
Membro desde: 20/12/2007 09:48:19
Mensagens: 26
Offline
|
Olá guigous, esse é um tipo de relacionamento muito simples e o JPA por default carrega seus objetos em modo lazy. Isso quer dizer que toda vez que você carregar uma Categoria as suas subcategorias não serão carregadas (o que é muito bom). Quando você precisar das subcategorias o método getCategorias() será chamado e apenas nesta hora a query (where idPai = x) será executada. As subcategorias das categorias contidas na collection obtidas pelo método getCategorias() também não terão suas subcategorias carregadas que é exatamente como eu faria com jdbc puro.
Desta forma, acredito que não haja mais nada que se possa otimizar neste tipo de relacionamento.
Espero ter sido claro na explicação.
Bons estudos! =)
|
visite e contribua no Submundojava - Certificação Java, Java Server Faces, RichFaces e muito mais. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/01/2008 17:01:22
|
guigouz
Debugger
Membro desde: 19/09/2006 23:08:34
Mensagens: 66
Offline
|
Eu to tendo um problema com o LazyLoad... usando Glassfish e Hibernate. Tenho uma entidade que tem vários filhos (nem é hierárquico como o exemplo que você passou, são duas entidades diferentes)... Um TreeBean (stateless EJB) pega a Entidade com o código
Com isso eu monto uma lista de filhos pro cara abrir um e ver os detalhes. O erro que acontece quando vou acessar qualquer um dos filhos é
Exception in thread "AWT-EventQueue-0" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.prosoma.memoria.entidades.Bem.registrosConservacao, no session or session was closed
Ok... o getRegistrosConservacao(); tá rodando no app-client (local - swing) e a sessão tá no server... Tem alguma dica da lógica disso aí ? Fazer outra query no server talvez ? ou MeuBean.load(Bem) que carregue os campos (no server)
To tentando otimizar ao máximo o processo
valeu
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/01/2008 22:52:41
|
henrique.lima
Thread.start()
![[Avatar]](/images/avatar/614484a1c3d62905498f756ee2a85010.jpg)
Membro desde: 20/12/2007 09:48:19
Mensagens: 26
Offline
|
Olá guigous. Não sei se entendi muito bem o seu problema, pois de uma maneira geral a collection retornada pelo seu método todos() deveria ser carregada normalmente. Me parece que vc deve ter filhos em um relacionamento 1 - * onde vc precise utilizar algo do tipo:
Os filhos não são carregados por causa do FetchType ser lazy e/ou seu ejb ser stateless. Uma maneira de resolver seria usar FetchType.EAGER ou então um stateful EJB. As duas soluções devem ser implementadas com cautela.
Se você puder detalhar melhor o seu problema, prometo me esforçar para tentar ajuda-lo.
Desculpe a demora para responder.
Abraço.
|
visite e contribua no Submundojava - Certificação Java, Java Server Faces, RichFaces e muito mais. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/01/2008 07:58:59
|
brunoja
Debugger
Membro desde: 09/01/2008 19:33:57
Mensagens: 63
Offline
|
henrique.lima wrote:Olá guigous, esse é um tipo de relacionamento muito simples e o JPA por default carrega seus objetos em modo lazy. Isso quer dizer que toda vez que você carregar uma Categoria as suas subcategorias não serão carregadas (o que é muito bom). Quando você precisar das subcategorias o método getCategorias() será chamado e apenas nesta hora a query (where idPai = x) será executada. As subcategorias das categorias contidas na collection obtidas pelo método getCategorias() também não terão suas subcategorias carregadas que é exatamente como eu faria com jdbc puro.
Desta forma, acredito que não haja mais nada que se possa otimizar neste tipo de relacionamento.
Espero ter sido claro na explicação.
Bons estudos! =)
Estou tendo um problema com o ManyToOne, ele ta carregando em modo eager, mesmo eu declarando: fetch = FetchType.LAZY!
Fiz um topico sobre este erro, deem uma olhada:
http://www.guj.com.br/posts/list/80214.java
Vlw!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/01/2008 10:53:17
|
guigouz
Debugger
Membro desde: 19/09/2006 23:08:34
Mensagens: 66
Offline
|
O meu problema era dentro do container, eu fazia a query no server, e precisava acessar as listas no cliente. Como na sua solução, que só funciona pro toplink, resolvi de um jeito que só funciona no hibernate, com
Ainda chego em algo melhor, mas por enquanto funciona
|
|
|
 |
|
|