"Received 'org.hibernate.LazyInitializationException' when invoking
action listener '#{controleBean.buscarPorCpfCnpj}' for component
'j_id606'
org.hibernate.LazyInitializationException: failed to lazily initialize
a collection of role: br.com.saybien.modelos.pessoas.Pessoa.emails, no
session or session was closed"
Estou usando JPA e controle de transação gerenciada pelo container
(JTA), portanto não sou eu quem abre ou fecha sessão. Pesquisando no
Livro "Enterprise JavaBeans 3.0" da editora O'Reilly, obtive a
seguinte informação: "O problema dessa inicialização sob demanda pode
ser resolvido de duas maneiras. A maneira óbvia é simplismente navegar
pelos objetos relacionados necessários enquanto a instância de
entidade continuar gerenciada por um contexto de persistência. A
segunda maneira é realizar a carga imediata quando você consulta a
entidade." Peraí, se eu tenho que carregar os relacionamentos sempre
dentro da mesma sessão JPA não faz o mínimo sentido eu ter
relacionamentos sob-demanada (LAZY) concordam?
Alguém já passou por isso? Melhor eu botar EAGER em tudo mesmo ou
estou modelando de forma errada meu projeto?
grato.
--
Danilo G. Magrini
danilo.magrini (AT) gmail (DOT) com
GPG Key: http://keyserver.ubuntu.com:11371/pks/lookup?op=get&search=0x3EAD0BBAFDE75A11
"Any fool can write code that a computer can understand. Good
programmers write code that humans can understand." (Martin Fowler)
pois é, não sou eu quem devo pegar na hora devida e sim o JSF já que
ele faz esse acesso em algum momento do seu Lifecycle.
Sim concordo, por isso estou batendo em cima do LAZY.
> Outra coisa é o lazy acontece porque o objeto está detached. Se quando for
> fazer alguma operação com ele você reanexá-lo a um EntityManager, não vai
> ter problema de lazy.
Infelizmente não sou eu que estou tentando obter programaticamente o
objeto emails do Pessoa e sim o JSF.
> E se você tiver opção, recomendo pensar no Seam, que é feito justamente com
> o objetivo de integrar jsf e ejb3.
Não tenho opção. Tem que ser sem o SEAM mesmo.
cara vou dar uma olhada... obrigado pela dica. Se for viável e eu
conseguir implementar eu coloco aqui.
acabei de olhar e pra mim não server pois eu uso JPA e JTA.
Usando JPA/EJB3, quando que um contexto de persistência (session) abre
e quando ele fecha? Já que eu não faço isso manualmente...
2009/9/9 Glauco P. Gomes <glauco...@yahoo.com.br>:
Se for assim então não faz sentido o container injetar EnityManager e
gerenciar as transações... Melhor que eu faça tudo na unha mesmo. Pra
quem vem do mundo desktop, esse HTTP é um retrocesso tecnológico afe.
Verifica se neste seu caso, a inicializacao por LAZY realmente é vantajosa.
Glauco P. Gomes
2009/9/9 Glauco P. Gomes <glauco...@yahoo.com.br>:
Outra coisa, vc realmente precisa de EJBs? Sua aplicacao é distribuida?
Vc pode utilizar Spring?
Glauco P. Gomes
Danilo Magrini escreveu:2009/9/9 Glauco P. Gomes <glauco...@yahoo.com.br>:De forma totalmente automatica nao tem como resolver. Vc que vai ter que abrir e fechar a sessao.Se for assim então não faz sentido o container injetar EnityManager e gerenciar as transações... Melhor que eu faça tudo na unha mesmo. Pra quem vem do mundo desktop, esse HTTP é um retrocesso tecnológico afe.
Pois é, eu não posso utilizar nada que não seja especificação. O Seam
fará parte da nova especificação, assim como o Facelets, mas até lá
não posso usar nada disso.
Aproveitando o assunto EJB, eu achei muito estranho essa de eu definir
em tempo de projeto o que será REMOTO e o que será LOCAL (falando de
Session Beans). Isso é ridiculo pois eu não sei o que será o que...
isso vai depender de N variáveis que inclusive podem mudar no decorrer
da vida do projeto. Outra coisa que eu achei estranho é o tal do
Persistent Unit.. ele tem que ser definido também em tempo de projeto?
E se Futuramente eu quiser ter 2 ou mais conexões? Ou quiser fazer
Login em Empresas diferentes que usam Persistent Units diferentes? Eu
tenho que criar outro dominio no servidor e fazer deploy de uma
aplicação inteira ali?? Sinceramente EJB3 ao meu ver não melhorou em
nada e Anotação só é viável pra sisteminha de locadora. Lamentável...
OK vou fazer a busca.
> Dica: Procure um framework que gerencie seus componentes de software (seja
> managed bean ou não). Como Spring ou mesmo JBoss Seam, pois JSF "puro" é
> praticamente um atraso de vida.
Pode ser... mas pelo menos não corro o risco de amanhã ter um sistema
legado por causa de um framework porco como aconteceu com o Struts.
grato.
Foi o que eu quis dizer colega, senão eu não seria tão burro a ponto
de não estar usando o Seam.
E sobre especificacao/JSR, acho importante, mas temos especificacoes que
"morreram", veja o JDO, vc conhece alguem que o utiliza em novos projetos?
Existem outras especificacoes que não "vingaram", por isso nao confie
100% no que é especificado, o que segura mesmo um framework é sua
popularidade e sua evolucao.
O Struts por um motivo ou outro teve sua época, mas, talvez por falta de
investimento, nao evoluiu o suficiente para se manter no auge.
Glauco P. Gomes
Aproveitando o assunto EJB, eu achei muito estranho essa de eu definir
em tempo de projeto o que será REMOTO e o que será LOCAL (falando de
Session Beans). Isso é ridiculo pois eu não sei o que será o que...
isso vai depender de N variáveis que inclusive podem mudar no decorrer
da vida do projeto.
Outra coisa que eu achei estranho é o tal do
Persistent Unit.. ele tem que ser definido também em tempo de projeto?
E se Futuramente eu quiser ter 2 ou mais conexões? Ou quiser fazer
Login em Empresas diferentes que usam Persistent Units diferentes? Eu
tenho que criar outro dominio no servidor e fazer deploy de uma
aplicação inteira ali??
Assim como qualquer outro framework morra também seja qual for o
motivo. Pelo menos com especificação tenho a garantia de
compatibilidade com a evolução e vários outros benefícios.
Como não? Bastaria que anotações aceitasse uma váriavel no nome da PU
ao invés de ter que ser fixo. * Não precisa explicar como anotações
funcionam pois já li sobre isso e sei porque não podem ser dinamicas
*.
> Agora se a questão que você fala é usar instancias diferentes da mesma
> estrutura de banco na mesma instancia da aplicação, aí sim não sei como você
> poderia fazer sem usar algo não especificado como Seam ou Spring.
> Usando esses caras você poderia "calcular" que EntityManager retornar
> baseado no perfil do usuário logado, por exemplo.
?? teria como ?? O que eu quero é exatamente isso, baseado em algum
arquivo seja DB, seja XML, seja properties eu, mediante um parametro
(login ou qualquer outro), injetar a instância EM referente aquele
perfil, mas para isso eu teria que ter N (JNDIs, DataSources) de nomes
diferentes e N Persistent Units para poder mudar em Runtime. O que
hoje é impossível usando as ferramentas que tenho. Então o que você
está dizendo é que isso seria possível se eu usasse Spring e Seam?
> Nesse ponto volta a questão que vários de nós falamos aqui... usar JSF, JPA,
> EJB3, ou seja lá o que for "puro" é atraso de vida. É necessário um cara que
> saiba lidar com tudo isso junto como o Seam e Spring fazem.
Não é atraso de vida. De repente eu tenho um framework próprio e
interno onde eu resolva essas questões..
> vai ter que criar
> SelectItems e conversores para Entities na mão, e por aí vái...
Exato .. e é outra coisa que eu procurei exaustivamente e não
encontrei outra forma de fazer.
> Mas como eu disse antes, entendo que muitas vezes, principalmente em
> empresas maiores ou com clientes mais "exigentes", é complicado argumentar
> mesmo tecnicamente parecendo tão óbvio :-/
Pode ser óbvio hoje.. assim como era quando existia Struts. Mas
entendo seu ponto de vista.
Não é atraso de vida. De repente eu tenho um framework próprio e
interno onde eu resolva essas questões..
Não seria melhor utilizar um framework open source ja consagrado, e na
hipótese dele "morrer", vc manter um fork interno na sua empresa, do que
criar outro do "zero"?
Glauco P. Gomes
?? teria como ?? O que eu quero é exatamente isso, baseado em algum
arquivo seja DB, seja XML, seja properties eu, mediante um parametro
(login ou qualquer outro), injetar a instância EM referente aquele
perfil, mas para isso eu teria que ter N (JNDIs, DataSources) de nomes
diferentes e N Persistent Units para poder mudar em Runtime. O que
hoje é impossível usando as ferramentas que tenho. Então o que você
está dizendo é que isso seria possível se eu usasse Spring e Seam?
> Nesse ponto volta a questão que vários de nós falamos aqui... usar JSF, JPA,
> EJB3, ou seja lá o que for "puro" é atraso de vida. É necessário um cara que
> saiba lidar com tudo isso junto como o Seam e Spring fazem.
Não é atraso de vida. De repente eu tenho um framework próprio e
interno onde eu resolva essas questões..
Fale por você.
Sim.
> Não seria melhor utilizar um framework open source ja consagrado, e na
> hipótese dele "morrer", vc manter um fork interno na sua empresa, do que
> criar outro do "zero"?
Creio que não pois não vou dar manutenção em códigos open-source, já
tive esse desprazer e posso te dizer que é a pior porquisse que
existe. Prefiro um interno pois ao menos consigo mantê-lo.
Provavelmente não vai dar certo, uma vez que meus Entities Manager são
injetados pelo container.
> Então.... mas se não fosse atraso de vida você não precisaria de um
> framework próprio para lidar com essas questões, não é mesmo? Na verdade nós
> concordamos, a diferença é que eu uso um framework de mercado e você um
> próprio, mas ambos servem para fazer com que a utilização dessas coisas
> todas juntas se tornem produtivas.
É bem isso... você se sente mais seguro usando os frameworks de
mercado e eu me sinto mais seguro usando o meu em vista de frameworks
que hora são "os 10 mais" e dias depois são "um lixo feito nas coxas".
Discordo. Mas obrigado pelo comentário.
Da uma estudada em como funciona o Spring e o Seam, mesmo se vc não for
utilizar, vc pode aproveitar algumas ideias, e implementar no seu framework.
Glauco P. Gomes
2009/9/10 Glauco P. Gomes <glauco...@yahoo.com.br>:
realmente eles não precisam ser injetados, porém eu gostaria muito de
deixar que o container gerencie pra mim para evitar de ter qeu ficar
me preocupando com transação e open/close de entitymanager.
Em que sentido?
> Por traz do Spring e do Seam tem grandes empresas, e estas estão preocupadas
> com a manutenibilidade.
Assim como era no Struts.
> Não é pq é open-source que o projeto é uma coxa de retalhos, pelo contrário,
> se vc estudar um pouco a documentação do Spring (que é bem escrita e
> detalhada), vc vai ter pouca dificuldade para extende-lo.
Então.. aqui já entra uma questão meio particular. Nos projetos que eu
já atuei (e tentei atuar) a documentação era uma coisa e a mão na
massa era oooooooutra coisa completamente diferente... parece óbvio,
mas você sabe sobre o que eu estou falando.
Mas entendi seu ponto de vista sim.
2009/9/10 Glauco P. Gomes <glauco...@yahoo.com.br>:Entao open-source é tudo igual né?Em que sentido?
Dependendo do ponto de vista não mesmo.
> Assim como no seu caso não parece haver restrição alguma a utilização de
> determinadas tecnologias, porém uma decisão tua quanto as soluções adotadas.
Sim .. é isso. E se todos os frameworks fossem tão maravilhosos quanto
se mostram ser nunca haveria restrição de uso em nenhuma empresa,
setor ou qualquer coisa do genero.
> Somente alguns post sobre o assunto:
> http://www.milfont.org/tech/2008/01/20/frameworkstools-caseiros-ou-fechados/
> http://www.milfont.org/tech/2009/06/06/frameworks-caseiros-2-a-missao/
> http://www.rafaelcarneiro.net/blog/2008/05/23/frameworks-agindo-com-bom-senso/
São nada mais do que opiniões e experiências pessoais que não
necessariamente serão verdadeiras em todos os projetos. Se eu tivesse
tempo e saco e poderia descrever as ótimas experiências que tive com
frameworks caseiros e as péssimas com frameworks "conceituados". Não
sei porque mas até me pareceu que em alguns trechos o pessoal não
enxerga bem a diferença de framework e conjunto de bibliotecas
próprias.
> Uma pesquisa rápida no Google ou mesmo em fóruns como GUJ te ajudarão a
> entender o mal do famigerado framework caseiro :-)
Ou o bem. Tudo depende de experiências passadas, do aprendizado
através dos erros e etc. Sinceramente tenho muitas saudades do
JSP/Servlet. Hoje temos que usar frameworks para ajudar a corrigir os
problemas que você não teria se não usasse frameworks.. vide JSF-EJB3
-> JSF-SEAM-EJB3
Mas obrigado ae Rafael e outros pela conversa pois eu creio que é aqui
que está a beleza do Open-Source: a opção de escolha (apesar de ter
saudades de quando não tinha escolha) lol
realmente eles não precisam ser injetados, porém eu gostaria muito de
deixar que o container gerencie pra mim para evitar de ter qeu ficar
me preocupando com transação e open/close de entitymanager.
> Por traz do Spring e do Seam tem grandes empresas, e estas estão preocupadas
> com a manutenibilidade.
Assim como era no Struts.
Opa! Entendeu realmente o que eu estou tentando dizer! Agora a
afirmação final "o que dá quase na mesma de mudar de framework." que
faz toda a diferença? Será mesmo que da quase na mesma? Acho que só o
tempo dirá mesmo.
É extenso demais eu tentar te explicar assim digitando, agradeço a atenção.