Ajuda como converter DAO para Spring?

3 respostas
P

Olá,

hoje pra gravar em um objeto Usuario tenho que pegar a conexão com o banco
via hibernate e passo para todos DAOs essa conexão.

Como em Spring poderia melhorar isso ???

Alguém pode me ajudar …ou ter exemplos pra isso ???

abs

Xxxlic static void main(String[] args) {
		//Pegar Session Hibernate
		Session session = HibernateUtil.openSession();
		tx = session.beginTransaction();
		try{
			//Passa a Session para DAO
			XxxNivelFacade XxxNivelFacade = new XxxNivelFacade(session);
			XxxFilialFacade XxxFilialFacade = new XxxFilialFacade(session);
			XxxUsuarioFacade XxxUsuarioFacade = new XxxUsuarioFacade(session);
			//Instancia o objeto XxxUsuario
			XxxUsuario p = new XxxUsuario();
	
			//Ler o nivel
			XxxNivel nivel = XxxNivelFacade.find(XxxNivel.class, 01L);
			p.setNivel(nivel);
	
			//Ler a filial
			XxxFilial filial = XxxFilialFacade.find(XxxFilial.class, 900L);
			p.setFilial(filial);
			
			// Popula o Objeto XxxUsuario
			p.setLogin("pwd999");
			p.setSenha("senha nova9");
			p.setDtInicial(new Date());
			p.setDtFim(new Date());
			p.setNomeUsuario("Usuario999");
			Long nrcpf = Long.valueOf("[telefone removido]"); 
			p.setCpf(nrcpf);
			
			// Grava o objeto XxxUsuario
			XxxUsuarioFacade.persist(p);
			tx.commit();
	        System.out.println("____________________________________________________");
			System.out.println("Id  = "+p.getId());

		}catch(DAOException d){
			tx.rollback();
			System.out.println("Erro ="+d);
		}catch(Exception e){
			tx.rollback();
			System.out.println("Erro ="+e);
		}
			
		}
Xxxlic class XxxUsuarioFacade {
	private Transaction tx;;
	private XxxUsuarioDAOImpl XxxUsuarioDAOImpl ;
	private Session session ;
	private static Logger logger = Logger.getLogger(XxxUsuarioFacade.class);
	
	Xxxlic XxxUsuarioFacade(Session session){
		this.session = session;
		XxxUsuarioDAOImpl = new XxxUsuarioDAOImpl(this.session) ;
	}
	
	@SuppressWarnings("unchecked")
	Xxxlic <T> T find(Class<T> classe, Serializable id) throws DAOException {
		logger.info("Listando Id="+id);
		XxxUsuario retorno = null;
		
		try{
    	    retorno = (XxxUsuario) XxxUsuarioDAOImpl.find(classe, id);
		}catch(DAOException d){
			tx.rollback();
			System.out.println("Erro na Atualização do Usuário "+ d);
		}
		return  (T) retorno;    
	}

	Xxxlic <T> void merge(T entity) throws DAOException {
		logger.info("Salvando ou atualizando " + entity);
		try{
			XxxUsuarioDAOImpl.merge(entity);
		}catch(DAOException d){
			System.out.println("Erro na Atualização do Usuário "+ d);
		}
	    
		    
	}

	Xxxlic <T> void persist(T entity) throws DAOException {
		logger.info("salvando  " + entity);
		try{
			XxxUsuarioDAOImpl.persist(entity);
		}catch(DAOException d){
			System.out.println("Erro na Inclusão do Usuário "+ d);
		}
	}

	Xxxlic <T> void remove(T entity) throws DAOException {
		logger.info("Deletando " + entity);
		try{
			XxxUsuarioDAOImpl.remove(entity);
		}catch(DAOException d){
			System.out.println("Erro na Delelção do Usuário "+ d);
		}
	}
	
	Xxxlic Collection<XxxUsuario> findByName(String nome) throws DAOException{   
		logger.info("Busca Por Nome  =" + nome);
		Collection<XxxUsuario> usuarios = new ArrayList<XxxUsuario>();
		try{
			usuarios = XxxUsuarioDAOImpl.findByName(nome);	
		}catch(DAOException d){
			tx.rollback();
			System.out.println("Erro na Busca por Nome "+ d);
		}
		return  usuarios;
	        
    }
Xxxlic class XxxUsuarioDAOImpl extends BaseDAO  implements IXxxUsuarioDAO{
	@SuppressWarnings("unused")
	private static Logger logger = Logger.getLogger(XxxUsuarioDAOImpl.class);
	Xxxlic XxxUsuarioDAOImpl(Session session) {
		super(session);
	}
	
	@SuppressWarnings("unchecked")
	Xxxlic Collection<XxxUsuario> findByName(String nome) throws DAOException{   
	        Criteria c = session.createCriteria(XxxUsuario.class);   
	        c.add(Restrictions.like("nomeUsuario", "%" + nome.toUpperCase() + "%"));   
	        c.addOrder(Order.asc("nomeUsuario"));   
	           
	        return  c.list();   
	    }  


}

3 Respostas

Mark0z

Meu amigo, eu faço assim:

Crio os DAOs genéricos:

package br.com.nanstec.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;


public interface DaoGenerico<T, ID extends Serializable> {
	public Class<T> getObjectClass();
	public T salvar(T object);
	public T pesquisarPorId(ID id);
	public T atualizar(T object);
	public void excluir(T object);
	public List<T> todos();
	public List<T> listPesqParam(String query, Map<String, Object> params);
	public List<T> listPesqParam(String query, Map<String, Object> params, 
			int maximo, int atual);
	public List<T> listPesq(String query);
	public T pesqParam(String query, Map<String, Object> params);
	
}

Ex.: “Usuário” Genérico

package br.com.nanstec.dao;

import br.com.nanstec.modelos.Usuario;

public interface UsuarioDao  extends DaoGenerico<Usuario, Long>{

}

Ex.: DAO implementado

package br.com.nanstec.dao.imp;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import br.com.nanstec.dao.DaoGenerico;

@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
public class DaoGenericoImp<T, ID extends Serializable> 
implements DaoGenerico<T, ID> {

	private EntityManager entityManager; 

	private final Class<T> oClass;//object class

	public Class<T> getObjectClass() {
		return this.oClass;
	}


	@SuppressWarnings("unchecked")
	@PersistenceContext
	public void setEntityManager(EntityManager em) {
		this.entityManager = em;
	}


	protected EntityManager getEntityManager() {
		if (entityManager == null)
			throw new IllegalStateException("Erro");
		return entityManager;
	}

	@SuppressWarnings("unchecked")
	public DaoGenericoImp() {
		this.oClass = (Class<T>)
		( (ParameterizedType) getClass().getGenericSuperclass() ).
		getActualTypeArguments()[0];

	}


	@Override
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public T atualizar(T object) {
		getEntityManager().merge(object);

		return object;

	}

	@Override
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public void excluir(T object) {
		object = getEntityManager().merge(object);
		getEntityManager().remove(object);
	}



	@Override
	public T pesquisarPorId(ID id) {
		return (T) getEntityManager().find(oClass, id);
	}	


	@Override
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public T salvar(T object) {
		getEntityManager().clear();
		getEntityManager().persist(object);
		return object;
	}

	@SuppressWarnings("unchecked")
	public List<T> todos(){
		String queryS = "SELECT obj FROM "+oClass.getSimpleName()+" obj";
		Query query = getEntityManager().createQuery(queryS);
		return query.getResultList();

	}

	@SuppressWarnings("unchecked")
	public List<T> listPesqParam(String query, Map<String, Object> params){
		Query q = getEntityManager().createQuery(query);
		for(String chave : params.keySet()){
			q.setParameter(chave, params.get(chave));

		}
		return q.getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<T> listPesqParam(String query, Map<String, Object> params,
			int maximo, int atual){
		Query q = getEntityManager().
					createQuery(query).
					setMaxResults(maximo).
					setFirstResult(atual);
		
		for(String chave : params.keySet()){
			q.setParameter(chave, params.get(chave));

		}
		return q.getResultList();
	}	
	
	@SuppressWarnings("unchecked")
	public List<T> listPesq(String query){
		Query q = getEntityManager().createQuery(query);
		return q.getResultList();
	}	
	
	@SuppressWarnings("unchecked")
	public T pesqParam(String query, Map<String, Object> params){
		Query q = getEntityManager().createQuery(query);
		for(String chave : params.keySet()){
			q.setParameter(chave, params.get(chave));

		}
		try{
			return (T) q.getSingleResult();
		}catch(NoResultException nre){
			return null;
		}
	}

}

Ex.: “Usuário” implementação

package br.com.nanstec.dao.imp;

import br.com.nanstec.dao.UsuarioDao;
import br.com.nanstec.modelos.Usuario;

public class UsuarioDaoImp extends DaoGenericoImp<Usuario, Long> implements UsuarioDao {

}

No DAO implementado, eu uso algumas anotações do Spring para delegar a ele a função de controle de transações do Dao de Usuario e outros…
Depois, adiciono as classes nas configurações do Spring para usar o injection…

P

obrigado pelo retorno.

Mais um faVOR PODERIA ME passar a configuração que vc fez pra acessar o banco no arquivo xml do Spring.

Se puder me ajudar agradeceria sou inciante e estou tomando pau…

Mais uma coisa vou fazer um projeto que vai gerar um jar e ser usado em outros projetos pra acessar o Spring não sendo Web é só via lendo o arquivo spring-config.xml e fazer o Cast do bean do xml passando pro Objeto(sua instancia)?

abs

Mark0z

paribe:
obrigado pelo retorno.

Mais um faVOR PODERIA ME passar a configuração que vc fez pra acessar o banco no arquivo xml do Spring.

Se puder me ajudar agradeceria sou inciante e estou tomando pau…

Mais uma coisa vou fazer um projeto que vai gerar um jar e ser usado em outros projetos pra acessar o Spring não sendo Web é só via lendo o arquivo spring-config.xml e fazer o Cast do bean do xml passando pro Objeto(sua instancia)?

abs

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"&gt;

    &lt;bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&gt;
        &lt;property name="persistenceUnitName" value="default" /&gt;
    &lt;/bean&gt;

    &lt;context:annotation-config /&gt;

    &lt;bean id="transactionManager"
          class="org.springframework.orm.jpa.JpaTransactionManager"&gt;
        &lt;property name="entityManagerFactory" ref="entityManagerFactory" /&gt;
    &lt;/bean&gt;
    
    &lt;tx:annotation-driven /&gt;

    &lt;bean id="br.com.nanstec.dao.UsuarioDao" class="br.com.nanstec.dao.imp.UsuarioDaoImp" /&gt;
    &lt;bean id="br.com.nanstec.dao.GrupoDao" class="br.com.nanstec.dao.imp.GrupoDaoImp" /&gt;
    &lt;bean id="br.com.nanstec.dao.NoticiaDao" class="br.com.nanstec.dao.imp.NoticiaDaoImp" /&gt;
    &lt;bean id="br.com.nanstec.dao.VeiculoDao" class="br.com.nanstec.dao.imp.VeiculoDaoImp" /&gt;
    &lt;bean id="br.com.nanstec.dao.FabricanteDao" class="br.com.nanstec.dao.imp.FabricanteDaoImp" /&gt;
    &lt;bean id="br.com.nanstec.dao.ImagemDao" class="br.com.nanstec.dao.imp.ImagemDaoImp" /&gt;
&lt;/beans&gt;

O “<property name=“persistenceUnitName” value=“default” />” é a nome da configuração do JPA, default porque uso o Vraptor e pra funfar o nome tem que ser esse…são injetadas automaticamente os DAOs nos construtores das classes controladoras…com ajuda do spring-plugin para Vraptor…

Sabe que eu ainda não usei o Spring em projetos “não Web”, mas sempre desacoplo os modelos, os DAOs, o Spring e o JPA para um outro *.jar chamado model.jar além dos testes de unidade que faço usando o spring-test.jar .

E pra ultima pergunta olha estes exemplos:

http://www.java2s.com/Code/Java/Hibernate/SpringDaoDemo.htm

http://opensource.atlassian.com/confluence/spring/display/DISC/Adding+Interface+Injection+to+Spring

Vai te respoder tudo…:wink:

Criado 15 de setembro de 2009
Ultima resposta 15 de set. de 2009
Respostas 3
Participantes 2