Começo a ver que foi criado uma tempestade num copo d’água devido ao código abaixo:
Input input = new InputMap();
input.setValue("username", "sergio");
input.setValue("session", hibernate session aqui);
Context session = new ContextMap();
session.setValue("user", new User("sergio")); // contexto de sessão
Context application = new ContextMap();
application.setValue("algumacoisa", "hello"); // contexto da aplicacao
Locale loc = new Locale("pt", "BR"); // toda action possui o seu locale...
Action action = new HelloWorldAction(); // note que aqui podemos usar a interface
prepareAction(action, input, session, application, loc);
assertEquals(Action.SUCCESS, action.execute());
Nele eu estou passando uma session do hibernate para dentro de uma action, e isso foi motivo de muita discussão.
Estou pensando no seguinte cenário:
:arrow: Sistema em produção:
-
Filtro pega uma sessão da maneira que for (HibernateUtil, ThreadLocal, etc.) e colocar no INPUT da action ou injeta num setter da action. Se fosse Model-Driven injetaria diretamente no model (via getModel() da action)
-
Action de posso da sessão, injeta no model ou DAO. A action não faz uso da session, apenas a repassa (injeta) para o model ou DAO.
-
Action executa.
-
Filtro fecha a sessão.
OBS: Quem cuida da transação é o MODEL ou DAO. Isso está fora da discussão aqui.
:arrow: Ambiente de Testes
[color=red]- Não precisa injetar a session, pois o DAO ou o MODEL vão estar MOCKEADOS e não vão acessar o banco e dados.[/color] Pode meter um null na session e passar para a action.
Ficou um pouco esquisito o item em vermelho, mas como o objeto vai estar mockeado pode até fazer sentido.
A pergunta meio que persiste. Se não for a action que vai injetar as coisas no MODEL / DAO que ela contem, quem fará isso.
Ao vamos acoplar o HibernateUtil dentro do DAO e dane-se… (naoooooo… agora o chato sou eu! :lol: )
Thiago, a sua solução é bem legal. Só que acho que vc está acoplando o PersistenceManager a sua action. Vai ter que levar ele com vc para onde vc for.
A minha situação seria melhor descrita assim:
Tenho um model que precisa de uma session para fazer consultas loucas no banco-de-dados. Não tem DAO aqui. O meu model pode usar o HibernateUtil e ficar pra sempre dependente dele, ou pode receber via injection a session e ficar totalmente desacoplado. Se fosse a segunda opção, quem passaria a session pra ele? Pode ser o filtro ?