Pico container e Session do Hibernate

0 respostas
ze_kiefa

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();
    }

}
Criado 8 de agosto de 2008
Respostas 0
Participantes 1