| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/07/2011 12:56:24
|
AdemirPinto
Thread.start()
![[Avatar]](/images/avatar/6732648d9355578b7b4f70bff86b3083.jpg)
Membro desde: 19/01/2011 13:47:06
Mensagens: 43
Offline
|
Boa tarde pessoal.
Sou novo no mundo Java e muito entusiasmado. Vim do mundo desktop e PHP. Estou criando um programinha para aprendizado de JSF 2 + Hibernate 3. Meu ponto fraco é OO e padrões de projeto. Criei um Generic DAO e gostaria da opinião de vocês. Este negócio de Hibernate com JPA me confunde...rsss
Alguma opinião, crítica, etc?
GenericDAO:
ClientesDAO:
Muito obrigado a todos e fiquem com Deus
Ademir - BH
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/07/2011 15:23:42
|
AdemirPinto
Thread.start()
![[Avatar]](/images/avatar/6732648d9355578b7b4f70bff86b3083.jpg)
Membro desde: 19/01/2011 13:47:06
Mensagens: 43
Offline
|
Ninguém....
É que eu preciso saber se está ok para dar continuidade ao projeto.
Msm assim obrigado pelas 50 visualizações...rsss
Abraços a todos
Ademir
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/07/2011 19:39:41
|
javablue
JavaGuru
Membro desde: 16/04/2011 23:42:49
Mensagens: 223
Offline
|
E ae cara?
Então, eu particularmente achei seu DAO muito grande. Não precisa ter tantas funcionalidades assim não. Em OO se a classe tá ficando muito grande, tá na hora de refatorar.
E outra coisa, você usa um try catch apenas para throws? Você pode tirar o try catch e deixar só o throws no método que funciona.
|
Quando é preciso hora extra, é porque algo saiu errado. Quando é preciso várias horas extras, é porque se está trabalhando errado. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/07/2011 20:03:00
|
dtxk
Java Ninja
![[Avatar]](/images/avatar/5f5048350d1ed3a2227930926411f64c.jpg)
Membro desde: 09/03/2010 00:57:50
Mensagens: 264
Offline
|
AdemirPinto wrote:Ninguém....
É que eu preciso saber se está ok para dar continuidade ao projeto.
Msm assim obrigado pelas 50 visualizações...rsss
Abraços a todos
Ademir
Amigo eu achei suas classes interessante... inclusive vc esta usando bastante padrão... e achei legal que aprendeu rápido para quem veio do PHP, quanto tempo vc estudou Java? tem algum documento legal para indicar?
Agora uma dúvida que eu fiquei aqui porque vc cria suas classes genericas <T> e etc... como funciona isso é do proprio Java?
This message was edited 1 time. Last update was at 07/07/2011 20:05:23
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/07/2011 23:21:23
|
AbelBueno
Virtual Machine Man
Membro desde: 04/08/2010 09:37:57
Mensagens: 543
Offline
|
Confesso que a primeira vez que eu olhei, desisti quando vi o tamanho do código...
Achei interessante que você facilitou muito para as implementações reais de DAO...
Uma melhoria que faria é a seguinte:
A transação é importante para executar vários comandos em um bloco só: roda tudo ou nada...
Se no método do DAO você dá begin e commit, perde esse efeito..pois terá um commit a cada comando!
Uma solução seria passar a transação para o construtor do DAO, e outra classe gerenciar begins, commits e rollbacks..
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2011 07:20:18
|
raf4ever
GUJ Master
Membro desde: 30/01/2005 01:34:51
Mensagens: 1755
Localização: Fortaleza-Ce
Offline
|
Dá uma olhada no meu DAO:
|
Rafael Roque
Quis custodiet ipsos custodes?
IBM Certified SOA Associate
ITIL Foundations Certified
SCEA(I)
SCWCD
SCJP
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2011 08:47:56
|
AdemirPinto
Thread.start()
![[Avatar]](/images/avatar/6732648d9355578b7b4f70bff86b3083.jpg)
Membro desde: 19/01/2011 13:47:06
Mensagens: 43
Offline
|
javablue wrote:E ae cara?
Então, eu particularmente achei seu DAO muito grande. Não precisa ter tantas funcionalidades assim não. Em OO se a classe tá ficando muito grande, tá na hora de refatorar.
E outra coisa, você usa um try catch apenas para throws? Você pode tirar o try catch e deixar só o throws no método que funciona.
Valeu pelas dicas Javablue,
vou tirar os try e catch. Me fala uma coisa qual a sua sugestão de refatorar minha classe?
Muito obrigado a todos pelas respostas. Vou responder a todos.
Ademir
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2011 09:05:04
|
AdemirPinto
Thread.start()
![[Avatar]](/images/avatar/6732648d9355578b7b4f70bff86b3083.jpg)
Membro desde: 19/01/2011 13:47:06
Mensagens: 43
Offline
|
AbelBueno wrote:Confesso que a primeira vez que eu olhei, desisti quando vi o tamanho do código...
Achei interessante que você facilitou muito para as implementações reais de DAO...
Uma melhoria que faria é a seguinte:
A transação é importante para executar vários comandos em um bloco só: roda tudo ou nada...
Se no método do DAO você dá begin e commit, perde esse efeito..pois terá um commit a cada comando!
Uma solução seria passar a transação para o construtor do DAO, e outra classe gerenciar begins, commits e rollbacks..
Olá AbelBueno,
obrigado pelo retorno. Vou melhorar esta classe com relação à transção conforme sua ideia. Vc tem uma ideia de como seria uma outra classe pra fazer este controle de transação?
Muito obrigado!
Ademir
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2011 09:08:04
|
AdemirPinto
Thread.start()
![[Avatar]](/images/avatar/6732648d9355578b7b4f70bff86b3083.jpg)
Membro desde: 19/01/2011 13:47:06
Mensagens: 43
Offline
|
raf4ever wrote:Dá uma olhada no meu DAO:
raf4ever,
como que funciona este EntityManager? Isso é spring? Desculpe a ignorância.
Obrigado pela resposta.
Ademir
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2011 09:15:06
|
AdemirPinto
Thread.start()
![[Avatar]](/images/avatar/6732648d9355578b7b4f70bff86b3083.jpg)
Membro desde: 19/01/2011 13:47:06
Mensagens: 43
Offline
|
dtxk wrote:
AdemirPinto wrote:Ninguém....
É que eu preciso saber se está ok para dar continuidade ao projeto.
Msm assim obrigado pelas 50 visualizações...rsss
Abraços a todos
Ademir
Amigo eu achei suas classes interessante... inclusive vc esta usando bastante padrão... e achei legal que aprendeu rápido para quem veio do PHP, quanto tempo vc estudou Java? tem algum documento legal para indicar?
Agora uma dúvida que eu fiquei aqui porque vc cria suas classes genericas <T> e etc... como funciona isso é do proprio Java?
Fala dtxk,
obrigado pelos elogios...rsss Estou só começando, na verdade eu juntei uns Generic DAO daqui do forum, juntei conforme minha necessidade e aquilo que eu ia compreendendo, não queria uma coisa muito sofisticada e complexa. Sobre como aprendi, além de ser formado em Ciencia da Computação pela Universidade Federal de Viçosa-MG, pra mim a net é a sala de aula e o google é meu livro....rssss
Eu usei gerericas<T> para exatamente ter como extender nas classes especificas: como ClienteDAO, FornecedorDAO, ContaBancariaDAO, etc....acho que é por este motivo...ou estou falando bobagem???rsss
Abraços
Ademir
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2011 09:20:00
|
von.juliano
GUJ Master
![[Avatar]](/images/avatar/efb61dd984183066a8815190a28bd956.jpg)
Membro desde: 15/01/2007 13:31:32
Mensagens: 1266
Offline
|
Eu sou contra herdar um dao genérico em cada um de seus daos. O dao genérico possui inúmeros comportamentos que geralmente o dao filho nunca vai usar, gerando herança desnecessária. Ao invés disso, injete o dao genérico pelo construtor, e faça uso dele quando for necessário.
Tenho que enfrentar problemas enormes de herança graças a daos genéricos desnecessários.
|
É difícil manter-se religioso quando algumas pessoas simplesmente não são carbonizadas por raios!
Desenvolvendo software de forma simples! - http://vonjuliano.wordpress.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2011 09:35:27
|
AdemirPinto
Thread.start()
![[Avatar]](/images/avatar/6732648d9355578b7b4f70bff86b3083.jpg)
Membro desde: 19/01/2011 13:47:06
Mensagens: 43
Offline
|
von.juliano wrote:Eu sou contra herdar um dao genérico em cada um de seus daos. O dao genérico possui inúmeros comportamentos que geralmente o dao filho nunca vai usar, gerando herança desnecessária. Ao invés disso, injete o dao genérico pelo construtor, e faça uso dele quando for necessário.
Tenho que enfrentar problemas enormes de herança graças a daos genéricos desnecessários.
Obrigado von.juliano pelas suas criticas que são de muito valia. Vc tem aí um exemplo de injeção de dao generico?
Abraços
Ademir
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2011 09:46:05
|
maior_abandonado
JWizard
![[Avatar]](/images/avatar/0d7c463832b871c20405a6c9296b5517.jpg)
Membro desde: 03/09/2007 11:30:08
Mensagens: 2694
Localização: sp
Offline
|
eu achei legal por que deu para ver que você caprichou... pensou em fazer tomando cuidado com os detalhes...até por quÊ ficou grande... confesso que também não li tudo com calma, só dei uma olhadinha.
Algumas dicas que a experiência e alguns estudos demonstram para agente:
Evite deixar o dao gerenciar sua session do hibernate... assim fica mais dificil de você sempre fecha-la da forma correta... sempre passe a sessão para o seu Dao e caso ela esteja fechada lance uma exceção por exemplo... dao não deveria abrir sessão, o seu modelo, seila, seu BO deve abrir a sessão, passar uma sessão válida para os daos fazerem o que tiverem que fazer e ai no BO você comita ou da rollback caso tenha dado erro, assim vai comitar ou rollbackear tudo o que foi feito (a menos que a regra de negócio seja comitar só uma metade caso só ela tenha dado certo e dar rollback no que não deu, o que eu nunca vi, e mesmo que seja essa a ideia, dao não é lugar de regra de negócio, é lugar de operação com o banco pura e simples). Não se esqueça de ter um try catch no seu BO dando commit no final do try, rollback no catch.
quanto aos try catchs do dao, eles serão necessários caso você queira fazer alguma coisa em caso de erro (obvio, é a utilidade mais básica do try catch...). Como acabei de indicar você a deixar o rollback em outro lugar ele a principio não teria mais utilidade, mas eu te indico que em caso de erro você gere um log no dao dizendo o que vocÊ estava tentando inserir/atualizar/busca/deletar... logando por exemplo a classe e método do seu dao e o toString do pojo que você estava tentando... fazer o que estava fazendo, assim é facil detectar o que aconteceu no futuro em caso de algum erro. Ja que seria esse log só no caso de erro, ele deve ficar no catch, tornando-o necessário, não se esqueça de dar o throw depois disso para avisar a camada de cima (um BO por exemplo) que o erro aconteceu, assim ela pode tomar a decisão que precisar, dar o rollback na sessão do hibernate, avisar o controller para que este então redirecione para uma tela de erro por exemplo. Eu gosto de além de logar no dao quais eram as informações que deu erro ao inserir por exemplo, logar no modelo alguma coisa do tipo "erro ao ...".
Procure deixar seus pojos sempre com o fech Lazy, para ficar mais leve ao obter suas entidades no banco. é possivel que vocÊ tenha problemas de Lazy Innicialization, a dica abaixo resolve.
Para gerenciar como você abre sua sessão do hibernate (e como fecha), eu te aconselharia ver o padrão Open Session In View...
essa é uma leitura muito boa, mas isso é só mais para frente...
bom... no demais parabéns... gostei muito do seu dao e se me permite peço para pegar ele e adapta-lo...
This message was edited 1 time. Last update was at 08/07/2011 09:51:42
|
espero ter ajudado...
falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2011 09:51:43
|
von.juliano
GUJ Master
![[Avatar]](/images/avatar/efb61dd984183066a8815190a28bd956.jpg)
Membro desde: 15/01/2007 13:31:32
Mensagens: 1266
Offline
|
Ao invés de extender o dao genérico: você o passa pelo construtor: Aí você cria os métodos que o ClienteDao deve ter, que provavelmente serão uma quantidade muito menor do que os que existem no dao genérico, e o utiliza quando necessário. Uma dica para quem está começando: herança é um perigo, muito cuidado!
This message was edited 1 time. Last update was at 08/07/2011 09:52:46
|
É difícil manter-se religioso quando algumas pessoas simplesmente não são carbonizadas por raios!
Desenvolvendo software de forma simples! - http://vonjuliano.wordpress.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2011 11:48:44
|
AdemirPinto
Thread.start()
![[Avatar]](/images/avatar/6732648d9355578b7b4f70bff86b3083.jpg)
Membro desde: 19/01/2011 13:47:06
Mensagens: 43
Offline
|
von.juliano wrote:Ao invés de extender o dao genérico:
você o passa pelo construtor:
Aí você cria os métodos que o ClienteDao deve ter, que provavelmente serão uma quantidade muito menor do que os que existem no dao genérico, e o utiliza quando necessário.
Uma dica para quem está começando: herança é um perigo, muito cuidado!
Fala von.juliano. Cara agora vc me deixou confuso...rsss Uma das ideias de herança não é remover código duplicado e coloca-lo na classe pai? Como assim que herança é perigoso?
Como que funciona este negocio de injeção do dao generico?
Abraços e muito obrigado
Ademir
|
|
|
 |
|
|