| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/07/2011 07:23:37
|
andredecotia
JWizard
![[Avatar]](/images/avatar/3e0c75ef9041e74cc2a533fa0fbbf33a.jpg)
Membro desde: 19/10/2009 14:37:32
Mensagens: 2267
Localização: São Paulo
Offline
|
Flavio Almeida wrote:Vai aqui um apelo para o pessoal que está começando a usar JPA/Hibernate: planejem suas consultas primeiro, para depois pensarem no uso de cache de segundo nível.
Mais uma vez, apareceram problemas em decorrência deste pattern para eu resolver.
Oi Flávio, bom dia. Poderia explanar a situação que está enfrentando, citando código e a idéia de como você faria... ???
Abraço,
|
--
André AS
Analista Programador Java Web freelancer / home office
Linkedin: http://www.linkedin.com/profile/view?id=41470291&trk=tab_pro
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/07/2011 07:53:25
|
FernandoFranzini
GUJ Master
![[Avatar]](/images/avatar/33f6c40df1060aa3c548ad2d499eced0.jpg)
Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline
|
andredecotia wrote:Alguém usa algum padrão diferente de Open Session In View ao trabalhar com JPA?
Se vc continuar usando recursos LAZY não, caso contrario sim.
|
Fernando Franzini |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/07/2011 10:33:28
|
Flavio Almeida
Java Ninja
![[Avatar]](/images/avatar/87064c139c707be62972ced58b6c5f9f.jpg)
Membro desde: 06/11/2009 14:01:46
Mensagens: 251
Localização: Niterói, RJ
Offline
|
Oi Flávio, bom dia. Poderia explanar a situação que está enfrentando, citando código e a idéia de como você faria... ???
Posso claro, mas devo fazer isso durante a semana, pois estou refatorando um sistema, motivo pelo qual "desabafei" aqui.
Assim que entregar o prometido, tentarei, em poucas palavras, dizer o que eu enfrentei e como resolvi a situação.
|
"o único homem educado é o homem que aprendeu a aprender" - Carl R. Rogers |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/08/2011 07:04:45
|
Flavio Almeida
Java Ninja
![[Avatar]](/images/avatar/87064c139c707be62972ced58b6c5f9f.jpg)
Membro desde: 06/11/2009 14:01:46
Mensagens: 251
Localização: Niterói, RJ
Offline
|
andredecotia, não entrarei nos pormenores como eu resolvo os problemas que apontei, por uma questão de tempo, mas em linhas gerais, eu faço o seguinte:
- uso CDI para controlar o ciclo de vida do EntityManager ou Session do Hibernate. Aqui eu ataco o problema do gerenciamento do EntityManager, que passa a ficar sob responsabilidade do contêiner;
- uso um CDI custom escope que é menor que o de request, ou seja, ele não deixa o EntityManager ou a Session disponível durante a fase de renderização, porque eu não quero acessar a camada de infraestrutura na view. Caso você não tenha experiência em criar um escopo costumizado em CDI, você pode usar o @RequestScoped, mas isso ainda permite que o desenvolvedor acesse objetos com inicialização lazy durante a fase de renderização, mas de maneira NÃO transacional (isso porque não queremos abrir e fechar a transação por escopo, certo?), uma outra má prática;
- uso um CDI Interceptor simples, para abrir e fechar a transação atomicamente. Como OpenSessionInView, a transação, na maioria das vezes, é feita no próprio filter, tornando-se um problema quando você precisa tratar alguma exceção disparada durante o commit;
- Planejo minhas consultas, geralmente, voltadas para determinado caso de uso, desta forma, eu não deixo chegar na view objetos com inicialização tipo lazy, além de otimizar a consulta, uma vez que retornar uma lista da entidade X nem sempre é a melhor opção.
O que é importante aqui é deixar uma infraestrutura que "force" o desenvolvedor a planejar suas consultas, desta forma, evitar OpenSessionInView é conseguir tal infraestrutura. Você pode continuar a usar OpenSessionInView (como os problemas que relatei) e planejar as suas consultas, caso não queria ou não possa interferir na forma com que o sistema foi organizado, mas isso permitirá que outros desenvolvedores, menos conscienciosos, realizam barbaridades.
Se você puder utilizar CDI, uma especificação Java, sem hiato, escolha a implementação da Apache, porque, na minha prática, ela é superior a implementação da JBoss (Weld).
andredecotia, só te peço uma coisa, de coração, não vá no meu bico, tenha a sua própria experiência. Você pode sentir na prática que tudo isso que eu falei não vale o esforço e por mais que eu defenda que tudo isso vale a pena, jamais poderei ir contra a sua experiência. As pessoas esquecem que a personalidade do programador tem relação com o código que ele escreve e como ele percebe o resultado qualitativamente. Além de desenvolvedor (formado, pós-graduado, blá, blá, blá) tenho formação em psicologia e estou escrevendo uma artigo sobre como usar ACP no gerenciamento de projetos Ágeis, algo inédito até então. Aproveitei para fazer uma propaganda, desculpe
This message was edited 1 time. Last update was at 01/08/2011 07:06:49
|
"o único homem educado é o homem que aprendeu a aprender" - Carl R. Rogers |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/09/2011 11:15:38
|
marcusviniciusaso
Debugger
Membro desde: 14/09/2010 10:57:59
Mensagens: 65
Offline
|
Alguns dias atrás me deparei com a questão de como fazer o controle de transações em uma aplicação web utilizando Hibernate. Resolvi ao invés de utilizar o Open Session In View, inserir um pouco de Spring na aplicação e deixar com ele o controle de transações. Até o momento sem maiores problemas com esta combinação.
|
Marcus Vinícius
SCJA | SCJP | OCPWCD |
|
|
 |
|
|
|
|