DAO com IoC

Realmente, Value Object fica mais bem explicado.

Mas eu ainda acho que DAOs com estado são um bixo perigoso, o que vai ter de gente querendo meter controle de transações nos DAOs não vai caber no gibi :mrgreen:

Acho que eu pensei errado.

Imagina um MODEL, não um DAO, que precisa de uma session do Hibernate.

Vc pode meter um HibernateUtil lá dentro ou pode injetar a session via setter.

O que é mais recomendável ???

Eu prefiro injetar a session, pois eu posso controlar a configuração do Hibernate junto com o restante da configuração da minha aplicação, e não numa classe estática.

Injetando eu tb posso fazer isso num filtro, o que me garante o fechamento automático, etc.

Aí o HibernateFilter náo ficaria todo sem sentido e poderia ser usado pela action para injetar a session no model.

O que faz sentido de tudo isso ?

lendo a definição de DAO, pensei nesta DAOFactory:


public class ClientDAOFactory{

private Map daos;

private static ClientDAOFactory instance;

privete ClientDAO createDAO(String daoName){

Class daoClass = daos.get(daoName);

return daoClass.newInstance();
}

private ClienteDAOFactory(){

daos = new HashMap();
daos.put("OracleDAO",OracleDAO.class);
daos.put("HiberanteDAO",HiberanteDAO.class);
//...
}

public ClientDAOFactory getInstance(){

if (instance == null)
   instance = new ClientDAOFactory();
return instance;
}


}



}

[quote=saoj]Acho que eu pensei errado.

Imagina um MODEL, não um DAO, que precisa de uma session do Hibernate.

Vc pode meter um HibernateUtil lá dentro ou pode injetar a session via setter.

O que é mais recomendável ???

Eu prefiro injetar a session, pois eu posso controlar a configuração do Hibernate junto com o restante da configuração da minha aplicação, e não numa classe estática.

Injetando eu tb posso fazer isso num filtro, o que me garante o fechamento automático, etc.

Aí o HibernateFilter náo ficaria todo sem sentido e poderia ser usado pela action para injetar a session no model.

O que faz sentido de tudo isso ?

[/quote]

O que é um model?

O que é que você quer abstrair? O Hibernate ou o acesso a um mecanismo de persistência?

[quote=microfilo]lendo a definição de DAO, pensei nesta DAOFactory:

[code]

public class ClientDAOFactory{

private Map daos;

private static ClientDAOFactory instance;

privete ClientDAO createDAO(String daoName){

Class daoClass = daos.get(daoName);

return daoClass.newInstance();
}

private ClienteDAOFactory(){

daos = new HashMap();
daos.put(“OracleDAO”,OracleDAO.class);
daos.put(“HiberanteDAO”,HiberanteDAO.class);
//…
}

public ClientDAOFactory getInstance(){

if (instance == null)
instance = new ClientDAOFactory();
return instance;
}

}

}

[/code][/quote]

Prefiro mil vezes IoC a usar factories.

da uma olhada no ioc do projeto do guj no java.net. tem o que voce ta querendo.

mas no caso as duas opcoes sao hibernate e prevayler. nao sei como esta o codigo do prevayler mas da para se basear no factory de la para abstrair mais

[quote=microfilo]lendo a definição de DAO, pensei nesta DAOFactory:

[code]

public class ClientDAOFactory{

private Map daos;

private static ClientDAOFactory instance;

privete ClientDAO createDAO(String daoName){

Class daoClass = daos.get(daoName);

return daoClass.newInstance();
}

private ClienteDAOFactory(){

daos = new HashMap();
daos.put(“OracleDAO”,OracleDAO.class);
daos.put(“HiberanteDAO”,HiberanteDAO.class);
//…
}

public ClientDAOFactory getInstance(){

if (instance == null)
instance = new ClientDAOFactory();
return instance;
}

}

}

[/code][/quote]

Só uma sugestão de melhoria!

Não acho muito legala idéia de você criar um OracleDAO, HibernateDAO, MySQLDAO.

Essa sua fábrica deveria saber criar um ClienteDAO, AlunoDAO, EmpresaDAO e ai por diante. Em um arquivo de properties, tu diz qual é a implementação do DAO que tu prefere, por exemplo

FrabricaDeDAO.properties

implementacao_do_DAO = MySQL
#implementacao_do_DAO = Oracle
#implementacao_do_DAO = Hibernate

Como a linha do MySQL está descomentada, isso quer dizer que sua fábrica quando criar um ClienteDAO, ele irá instanciar um ClienteDAO para acessar um banco de dados MySQL.

Para que vocÊ mude a implementação da sua aplicação para Hibernate por exemplo, basta descomentar a linha do Hibernate e comentar a do mysql. Pronto, agora sua aplicação suporta Oracle.

Normalmente o pessoal implementa usando a AbstractFactory e FactoryMethods! Vale a pena conferir! :wink:

Thiago Senna

[quote=Maurício Linhares]
O que é um model?

O que é que você quer abstrair? O Hibernate ou o acesso a um mecanismo de persistência?[/quote]

Model = Modelo de negócios

Pense que tenho um modelo que precisa fazer mil consultas no banco de dados e pra isso vou usar a session do hibernate.

Quero desacoplar essa session dele, isto é, não quero que ele use HibernateUtil. Quero injetar essa session nele quando for executar esse modelo.

E a pergunta é. Posso (e devo) fazer isso via action, isto é, action injeta no model ???

Não achei. Qual URL ?

[quote=saoj][quote=Maurício Linhares]
O que é um model?

O que é que você quer abstrair? O Hibernate ou o acesso a um mecanismo de persistência?[/quote]

Model = Modelo de negócios

Pense que tenho um modelo que precisa fazer mil consultas no banco de dados e pra isso vou usar a session do hibernate.

E a pergunta é. Posso (e devo) fazer isso via action, isto é, action injeta no model ???
[/quote]

Um objeto do modelo precisa fazer mil consultas no banco? Acho que tem alguma coisa vazando por aqui. Quem tem que fazer consultas no banco é o Dao ou seja lá o que for a camada de persistência, não o modelo.

O action pode injetar a sessão no Dao, não tem problema, mas se houverem vários Daos ele vai ter que injetar em todos os vários.

Vão haver casos de consultas complexas e outras coisas a mais que usar DAO não será a opção !!! Aí vc pode sim criar um modelo que vai no banco pegar o que ele precisa, usa JDBC ou HSQL, para calcular o que vc precisa.

[quote=saoj][quote=Maurício Linhares]
Um objeto do modelo precisa fazer mil consultas no banco? Acho que tem alguma coisa vazando por aqui. Quem tem que fazer consultas no banco é o Dao ou seja lá o que for a camada de persistência, não o modelo.
[/quote]

Vão haver casos de consultas complexas e outras coisas a mais que usar DAO não será a opção !!! Aí vc pode sim criar um modelo que vai no banco pegar o que ele precisa, usa JDBC ou HSQL, para calcular o que vc precisa.
[/quote]

Como por exemplo :?:

guj.dev.java.net? algo do genero…

[quote=Maurício Linhares]Opa Sérgio,
Quem é que vai chamar os métodos de iniciar e terminar? O meu código? Ops, feio, imagina chamar um método “connect()” e depois “commit()” num DAO? Matou a abstração toda dele.
[/quote]

E quem é que vai abir a transação e dar um commit ou rollback e fechar a sessão?