Olá galera,
estava fazendo um DAO genérico pra uma app desktop em java e comecei a pensar numas coisas curiosas. Com certeza a turma do GUJ deve ter bons conceitos disso. Tipo, num DAO genérico de uma app desktop sem Spring pra fazer Injeção de dependência, mas com Hibernate 3, eu preciso ficar toda hora: abre a sessão, abre a transação, realiza a operação(insert, delete, merge etc.), dá um flush na sessão, commit na transação e fecha a sessão. Aí surgem as idéias e as dúvidas:
1 - É terrível ficar repetindo código que não é de responsabilidade do DAO. Tipo getSession.flush() e tx.commit() e tal… Gerenciar transação não é papel do DAO. Td bem, com Spring é uma blz! Ele resolve isso fácil pra mim! Mas e sem spring? E outra, da forma como tá eu sempre terei uma transação por sessão. Não é muito flexível isso. Existe uma série de problemas em fazer isso. Oq vcs acham/costumam fazer?
2 - Tendo em vista a situação acima, decidi testar a mesma sessão pra cada DAO instanciado. Ou seja, eu nunca dou close() na sessão. Por outro lado, sempre dou clear() ao fim de cada método do DAO. Já nos métodos insert, delete e merge eu abro uma transação antes e fecho no mesmo método que a sessão é limpa. Daí o código não fica tão repetitivo (mas ainda fica um pouco) e eu posso usar n transações pra 1 sessão. Criei uma classe TransactionManager pra tratar isso fora do DAO. Essa estratégia de aproveitar a mesma sessão, é boa ou é sujeira?
3 - Pra resolver esse problema de forma simples eu só consigo pensar em AOP. Executar sempre antes dos métodos do DAO os métodos que iniciam a transação/sessão e após tudo isso, fechar. Alguém usa isso aqui? É bom?
É isso, quem puder esclarecer, fico grato.
[]s.