Estou utilizando uma fábrica de DAO’s, a qual retorna um DAO de acordo com o banco de dados adicionado.
UsuarioDAO daoHibernate = FabricaDAO.getFabricaDAO(TipoBancoDeDados.HIBERNATE).getUsuarioDAO();
UsuarioDAO daoMssql = FabricaDAO.getFabricaDAO(TipoBancoDeDados.MSSQL).getUsuarioDAO();
Segue a estrutura da fábrica de DAO.
public enum TipoBancoDeDados {
HIBERNATE{
@Override
protected FabricaDAO getFabricaDAO(){
return new FabricaDAOHibernate(HibernateUtil.getSession());
}
},
MSSQL{
@Override
protected FabricaDAO getFabricaDAO(){
// return new FabricaDAOMSSQL();
return null;
}
};
protected abstract FabricaDAO getFabricaDAO();
}
public abstract class FabricaDAO {
public abstract UsuarioDAO getUsuarioDAO();
public static FabricaDAO getFabricaDAO(TipoBancoDeDados tipo) {
return tipo.getFabricaDAO();
}
}
public class FabricaoDAOHibernate extends FabricaDAO{
private Session sessao;
public FabricaoDAOHibernate(Session sessao){
this.sessao = sessao;
}
@Override
public UsuarioDAO getUsuarioDAO() {
return new UsuarioDAOHibernate(this.sessao);
}
}
Eu preciso da Session no DAO do Hibernate , mas se ela for criada dentro da fábrica a Session ficará restrita a ela, pois não posso utilizar a Session em outros pontos da aplicação.
Quando tentei utilizar o Pico, ele reclamou que a Session não pode ser instanciada. Ele tem razão, até porque é responsabilidade do HibernateUtil isso.
public enum TipoBancoDeDados{
HIBERNATE{
@Override
protected FabricaDAO getFabricaDAO(){
MutablePicoContainer pico = new DefaultPicoContainer();
pico.registerComponentImplementation(Session.class);
pico.registerComponentImplementation(FabricaoDAOHibernate.class);
return (FabricaDAOHibernate) pico.getComponentInstance(FabricaoDAOHibernate.class);
}
}
}
Finalmente a dúvida: como injetar a Session na FabricaoDAOHibernate, se ela é criada BEM ANTES da instanciação dessa classe?
public class TesteFabricaDAO {
private Session sessao;
public TesteFabricaDAO() {
}
@Before
public void iniciar(){
this.sessao = HibernateUtil.getSession();
MutablePicoContainer pico = new DefaultPicoContainer();
pico.registerComponentInstance(this.sessao);
}
@Test
public void criarUsuarioDAO() {
this.sessao.getTransaction().begin();
assertEquals(UsuarioDAOHibernate.class, (FabricaDAO.getFabricaDAO(TipoBancoDeDados.HIBERNATE).getUsuarioDAO()).getClass());
this.sessao.getTransaction().commit();
this.sessao.close();
}
}