O Mais correto seria você criar proxyDinamico através da classe InvocationHandler. O correto seria ter o controle transacional dentro da fachada e não no DAO. Imagine o seguinte cenário: Em um facade você precise utilizar 2 DAO’s diferentes como você teria esse controle ?
No caso seria como você usar AOP dentro de seu código. A Maneira como o spring faz
Proxy.newProxyInstance(SEU BUSINESS OBJECT, new Class[]{INTERFACE_FACADE.class},new TransactionHandler(new iMPLEMENTAÇÃO_FACADE()));
}
Use seu Factory dentro de sua Facade ao invés de dentro do DAO, faça sua facade injetar a sessão que ela abrir em seus DAOs e passe a controlar de dentro da facade sua transação. Uma ideia seria passar a sessão pelo próprio construtor do DAO. Tranquilo?
Dentro do meu Factory, eu crio por exemplo um método “iniciarTransacao()”, dentro desse cara eu faço a conexão com o banco, seto o autocommit para false etc., crio um outro método para fazer o “commit” da transação e outro método para fazer o rollback, seria isso?
Não entendi direito a parte “Uma ideia seria passar a sessão pelo próprio construtor do DAO.”, pode me explicar melhor?
não, isso deve ser obrigação da sessão criada e não do factory, ele só cria a sessão para você.
[quote]
Não entendi direito a parte “Uma ideia seria passar a sessão pelo próprio construtor do DAO.”, pode me explicar melhor? [/quote]
por exemplo, se você tiver usando hibernate você hoje tá criando (chamando sua factory) suas session dentro do DAO, certo? Ao invez disso criaria na facade que passaria por parametro para seu DAO, eu só sugeri o momento de passar esse parametro que sei em sua criação (no seu construtor).
Connection con = ConnectionFactory.getConnection("nomeDoPool");
na sua fachada ao invez do DAO? passe essa sua referência “con” para o seu DAO e para muitos outros que sua fachada precisar… logo a operação de iniciar a transação, commitar e etc podem ser feitas pela fachada.
e respondendo a sua pergunta: sim, é possível fazendo isso ai acima.