Uso Hibernate (mais estou deixando minha aplicação livre, onde posso a qualquer hora trocar a comunicação com o banco de dados)
em primeiro lugar queria mostrar meu banco para esses objetos em particular,

Eu tenho portanto Interfaces DAO, que tenho q Implementar a depender de qual é minha comunicação com o Banco de Dados, vou mandar o print do eclipse de como ficou a interface depois de juntar os 3 objetos no mesmo DAO

Então eu tenho 1 uma interface IDAOFactory, nela eu tenho a lista de todos os DAOs, e tenho os metodos de Tranzação, assim não preciso saber como converso com o baco de dados…
[code]package br.com.aportepb.dao;
public interface IDAOFactory {
public void beginTransaction();
public void commitTransaction();
public void rollbackTransaction();
public CidadeDAO createCidadeDAO();
public PessoaDAO createPessoaDAO();
}[/code]
Tenho a classe que eu realmente converso que é estatica DAOFactory, e carrega o meu framework que conversa com o banco de dados
[code]package br.com.aportepb.dao;
import br.com.aportepb.dao.hibernate.HibernateDAOFactory;
public class DAOFactory {
private static IDAOFactory minhaDAO = new HibernateDAOFactory();
public static void beginTransaction() {
minhaDAO.beginTransaction();
}
public static void commitTransaction() {
minhaDAO.commitTransaction();
}
public static void rollbackTransaction() {
minhaDAO.rollbackTransaction();
}
public static CidadeDAO createCidadeDAO() {
return minhaDAO.createCidadeDAO();
}
public static PessoaDAO createPessoaDAO() {
return minhaDAO.createPessoaDAO();
}
}[/code]
Posteriormente pretendo fazer o carregamento do “IDAOFactory minhaDAO = new HibernateDAOFactory()” atraves de XML podendo ser configurado e modificado, pra rodar com cada tipo de framework pra conversar com o banco de dados…
No meu HibernateDAOFactory eu implemento IDAOFactory, assim, eu posso chamar ele depois estaticamente atravez do DAOFactory, que carrega o Hibernate, neste caso apartir do DAOFacotry eu desconheço que se trata de hibernate
[code]package br.com.aportepb.dao.hibernate;
import br.com.aportepb.dao.*;
public class HibernateDAOFactory implements IDAOFactory {
@Override
public void beginTransaction() {
HibernateHelper.beginTransaction();
}
@Override
public void commitTransaction() {
HibernateHelper.commitTransaction();
}
@Override
public void rollbackTransaction() {
HibernateHelper.rollbackTransaction();
}
@Override
public CidadeDAO createCidadeDAO() {
return new HibernateCidadeDAO();
}
@Override
public PessoaDAO createPessoaDAO() {
return new HibernatePessoaDAO();
}
}[/code]
e cada DAO que eu tenho do hibernate implementa a interface, nas formas do Hibernate … eu troquei pra 1 unico DAO para os 3 objetos
O meu CidadeDAO implementado para o Hibernate ficou assim
[code]package br.com.aportepb.dao.hibernate;
import java.util.List;
import br.com.aportepb.dao.CidadeDAO;
import br.com.aportepb.entidade.Cidade;
import br.com.aportepb.entidade.Estado;
import br.com.aportepb.entidade.Pais;
public class HibernateCidadeDAO implements CidadeDAO {
@Override
public void deleteCidade(Cidade cidade) throws Exception {
HibernateHelper.currentSession()
.delete(cidade);
}
@Override
public void deleteCidade(Integer idDoCidade) throws Exception {
HibernateHelper.currentSession().getNamedQuery(“Cidade.deleteFromId”)
.setInteger(“id”, idDoCidade)
.executeUpdate();
}
@Override
public void deleteEstado(Estado estado) throws Exception {
HibernateHelper.currentSession()
.delete(estado);
}
@Override
public void deleteEstado(Integer idDoEstado) throws Exception {
HibernateHelper.currentSession().getNamedQuery(“Estado.deleteFromId”)
.setInteger(“id”, idDoEstado)
.executeUpdate();
}
@Override
public void deletePais(Pais pais) throws Exception {
HibernateHelper.currentSession()
.delete(pais);
}
@Override
public void deletePais(Integer idDoPais) throws Exception {
HibernateHelper.currentSession().getNamedQuery(“Pais.deleteFromId”)
.setInteger(“id”, idDoPais)
.executeUpdate();
}
@Override
public Cidade getCidade(Integer idDoCidade) throws Exception {
return (Cidade)HibernateHelper.currentSession()
.get(Cidade.class, idDoCidade);
}
@Override
public Cidade getCidade(String nomeDoCidade) throws Exception {
return (Cidade)HibernateHelper.currentSession()
.getNamedQuery(“Cidade.fromNome”)
.setString(“nome”, nomeDoCidade)
.uniqueResult();
}
@Override
public Estado getEstado(Integer idDoEstado) throws Exception {
return (Estado)HibernateHelper.currentSession()
.get(Estado.class, idDoEstado);
}
@Override
public Estado getEstado(String nomeDoEstado) throws Exception {
return (Estado)HibernateHelper.currentSession()
.getNamedQuery(“Estado.fromNome”)
.setString(“nome”, nomeDoEstado)
.uniqueResult();
}
@Override
public Pais getPais(Integer idDoPais) throws Exception {
return (Pais)HibernateHelper.currentSession()
.get(Pais.class, idDoPais);
}
@Override
public Pais getPais(String nomeDoPais) throws Exception {
return (Pais)HibernateHelper.currentSession()
.getNamedQuery(“Pais.fromNome”)
.setString(“nome”, nomeDoPais)
.uniqueResult();
}
@SuppressWarnings(“unchecked”)
@Override
public List getCidades() throws Exception {
return HibernateHelper.currentSession()
.createCriteria(Cidade.class)
.list();
}
@SuppressWarnings(“unchecked”)
@Override
public List getCidades(Estado estado) throws Exception {
return HibernateHelper.currentSession()
.getNamedQuery(“Cidade.fromEstado”)
.setEntity(“estado”, estado)
.list();
}
@SuppressWarnings(“unchecked”)
@Override
public List getCidades(Pais pais) throws Exception {
return HibernateHelper.currentSession()
.getNamedQuery(“Cidade.fromPais”)
.setEntity(“pais”, pais)
.list();
}
@SuppressWarnings(“unchecked”)
@Override
public List getEstados() throws Exception {
return HibernateHelper.currentSession()
.createCriteria(Estado.class)
.list();
}
@SuppressWarnings(“unchecked”)
@Override
public List getEstados(Pais pais) throws Exception {
return HibernateHelper.currentSession()
.getNamedQuery(“Estado.fromPais”)
.setEntity(“pais”, pais)
.list();
}
@SuppressWarnings(“unchecked”)
@Override
public List getPaises() throws Exception {
return HibernateHelper.currentSession()
.createCriteria(Pais.class)
.list();
}
@Override
public void saveCidade(Cidade cidade) throws Exception {
HibernateHelper.currentSession()
.save(cidade);
}
@Override
public void saveEstado(Estado estado) throws Exception {
HibernateHelper.currentSession()
.save(estado);
}
@Override
public void savePais(Pais pais) throws Exception {
HibernateHelper.currentSession()
.save(pais);
}
@Override
public void updateCidade(Cidade cidade) throws Exception {
HibernateHelper.currentSession()
.update(cidade);
}
@Override
public void updateEstado(Estado estado) throws Exception {
HibernateHelper.currentSession()
.update(estado);
}
@Override
public void updatePais(Pais pais) throws Exception {
HibernateHelper.currentSession()
.update(pais);
}
@Override
public void loadCidade(Cidade cidade, Long id) {
HibernateHelper.currentSession()
.load(cidade, id);
}
}[/code]
Para quem kizer visualizar o HibernateHelper segue abaixo

Note que nenhum método é publico, pois ninguem fora do pacote br.com.aportepb.dao.hibernate necessita manusiar o HibernateHelper, visto que ele é acessado apenas as classes Hibernate…DAO (por exemplo HibernateCidadeDAO e HibernatePessoaDAO) e HibernateDAOFactory …
Abaixo segue o código do HibernateHelper
[code]package br.com.aportepb.dao.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
public class HibernateHelper {
private static final SessionFactory sessionFactory;
@SuppressWarnings(“unchecked”)
private static final ThreadLocal sessionThread = new ThreadLocal();
@SuppressWarnings(“unchecked”)
private static final ThreadLocal transactionThread = new ThreadLocal();
static {
try {
sessionFactory = new AnnotationConfiguration().configure()
.buildSessionFactory();
} catch (RuntimeException e) {
e.printStackTrace();
throw e;
}
}
@SuppressWarnings("unchecked")
static Session currentSession() {
if (sessionThread.get() == null) {
Session session = sessionFactory.openSession();
sessionThread.set(session);
}
return (Session) sessionThread.get();
}
@SuppressWarnings("unchecked")
static void beginTransaction() {
if (transactionThread.get() == null) {
Transaction transaction = currentSession().beginTransaction();
transactionThread.set(transaction);
}
}
@SuppressWarnings("unchecked")
static void commitTransaction() {
Transaction transaction = (Transaction) transactionThread.get();
if (transaction != null && !transaction.wasCommitted()
&& !transaction.wasRolledBack()) {
transaction.commit();
transactionThread.set(null);
}
closeSession();
}
@SuppressWarnings("unchecked")
static void rollbackTransaction() {
Transaction transaction = (Transaction) transactionThread.get();
if (transaction != null && !transaction.wasCommitted()
&& !transaction.wasRolledBack()) {
transaction.rollback();
transactionThread.set(null);
}
closeSession();
}
@SuppressWarnings("unchecked")
private static void closeSession() {
Session session = (Session) sessionThread.get();
if (session != null) {
session.close();
}
sessionThread.set(null);
}
}[/code]
Note que o método CloseSession é private, e é chamado apos fazer um rollback ou um commit … sendo assim, é facil a utilizacao, e é fechado sempre no momento correto, e não no meio de tranzações…
Bom acredito que no fim ficou bem facil, vai no post seguinte