JPA - Estratégia p/ Bases Gigantes

6 respostas
dlucchesi

Boa noite Galera,

Preciso de umas dicas. Surgiu uma bela oportunidade de usar JPA em um projeto novo (na realidade são duas oportunidades, projeto do zero é raro :smiley: ).

Leio muitas revistas e muitos artigos na net, mas uma dúvida que surgiu e que pode inviabilizar o uso do JPA me preocupa.

Todos os artigos e exemplos que vejo, utilizam a estratégia de acesso EAGER. Mas digamos que a base alvo seja um elefante branco (na realidade está mais para baleia). Como fica o desempenho? Teria alguma estratégia p/ um acesso mais limitado (se possível s/ queries)?

Vi um cara chamado Criteria mas me parece trabalhoso.

Me desculpem se escrevi alguma bobagem e saibam que fiquei mais de 1 hora procurando por algo parecido c/ minha dúvida aqui no fórum.

Se alguém puder me passar links agradeço.

Valew

6 Respostas

GabrielCardelli

Você pode utilizar em relacionamentos a propiedade FetchTYPE.LAZY ao invez do EAGER

E nas propriedades básicas que possuem dados “gigantes” vocẽ pode utitlizar @Basic passando o FetchType como LAZY tambem

isso fará com que os dados só sejam carregados quando você precisar utiliza-los.

R

Que nada,Criteria é show de bola :smiley:

maior_abandonado

o mais indicado é você usar lazy sempre que puder… evitar os eager ao máximo…

claro que com isso você pode ter uns lazyInitializaionException mas ai pega isso nos testes e da um merge na entidade que você está chamando o getter antes de chama-lo para resolver este problema… (claro que no comecinho vai dar um certo trabalho mas é muitas e muitas vezes menor do que se fosse para usar jdbc).

dlucchesi

Galera,

Valew pelos posts. Mas novamente, após refletir e pesquisar sobre suas respostas, outras dúvidas :smiley:

Se eu usar, conforme me indicaram FetchTYPE.LAZY, num ambiente de páginas JSF (request scope) ou mesmo EJBs Stateless, isso não pode gerar excessões por utilizar essa estratégia de relacionamento?

Estou pesquisando melhor o Criteria.

Se, como o maior abandonado indicou, fazer um merge das entidades secundárias ao relacionamento resolver, sou obrigado a fazer isso sempre?

Valew mesmo galera, estão me ajudando muitíssimo

maior_abandonado

dlucchesi:
Galera,

Valew pelos posts. Mas novamente, após refletir e pesquisar sobre suas respostas, outras dúvidas :smiley:

Se eu usar, conforme me indicaram FetchTYPE.LAZY, num ambiente de páginas JSF (request scope) ou mesmo EJBs Stateless, isso não pode gerar excessões por utilizar essa estratégia de relacionamento?

Estou pesquisando melhor o Criteria.

Se, como o maior abandonado indicou, fazer um merge das entidades secundárias ao relacionamento resolver, sou obrigado a fazer isso sempre?

Valew mesmo galera, estão me ajudando muitíssimo

cada caso é um caso… vamos supor um exemplo, se você tiver pessoa e endereço, sendo que pessoa tem x endereços. supondo que você recuperou as pessoas em session bean stateless com o endereço lazy e fechou o entity manager.

ai em outra chamada a um session bean stateless você pega essa pessoa e chama o método getEndereço. Você até tem o objeto da pessoa, ele foi retornado por um entity manager mas ele ja foi fechado, sendo assim seu objeto pessoa não está mais gerenciado, se você chamar o método vai ter um lazy initialization. Para resolver isso você precisa dar um merge no seu objeto pessoa, para que ele fique gerenciado, ai então chamar o método getEnderecos. Desta forma pelo objeto voltar a ser gerenciado quando você der o merge, não vai dar erro, vai fazer a query e poopular os objetos endereço quando você chamar o getter. O mesmo vale para você dar updates ou deletes neste objeto pessoa (indiferente ao fetchType escolhido). Ou então se seu EntityManager estiver injetado, você poderia mudar o session bean por exemplo para statefull e assim manter a sessão aberta até o bean terminar.

Como falei, cada caso é um caso, você só vai precisar ter este trabalho em casos onde vai usar estes recursos e a sessão que os gerencia ja tiver sido fechada, não é em todos os lugares…

dlucchesi

Veio era isso mesmo,

Era essa a dúvida que eu precisava esclarecer. O jeito de “re-colocar” o cara no contexto do EntityManager é fazer o merge. Assim todos os relacionamentos desse cara voltam a ser válidos e aí eu consigo recuperar os outros dados.

Estou pensando em usar o EJB 3x já que é um projeto novo. Mas infelizmente, devido a natureza da aplicação, acho que vou optar por um único Statefull Bean (que vai funcionar mais ou menos como um controle de sessão) e os Beans que fazem os relacionamentos e toda a parte de dados vão ser stateless mesmo.

Galera muito obrigado pelas dicas.

Mas desde já gostaria de deixar uma dica tb. Sei que p/ efeito de ilustração, nos tutoriais e matérias é mais fácil usar o EAGER, mas se vc está pensando em escrever algo sobre JPA, não deixe de mencionar como usar o LAZY, como aprendi neste post.

Valew Galera

Criado 25 de setembro de 2011
Ultima resposta 26 de set. de 2011
Respostas 6
Participantes 4