Devo criar 2 DAOGenericos?

14 respostas
S

Ola galera estou estudando JPA, Hiberbate e JSF, e estou com uma certa dificuldade a dias para solucionar este problema e dúvida.

Segui exemplo de um tutorial na internet e fiz um projeto que persiste no banco usando os tal framework, ai quis aumentar meus conhecimentos e resolvi colocar mais coisass nessa projeto inclussive a insersão de um novo CRUD em um outro banco.

Conclusão to mais peridido que cego em tiroteio.

Veja só … para cada banco devo ter um DAOGenerico? devo ter 2 classes abstratas DaoGenericoImp?

Locura porque inserir 2 bancos em uma dao generico esta me deixando louco e alem disso não sei nem se é o correto.

14 Respostas

romarcio

Você deve ter apenas um DAO Generico.

S

Agradeço sua atencao, veja meu codigo que implementa o DAOGenerico

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.imc.dao.imp;
/**
 *
 * @author samuelM
 */
import br.com.imc.dao.DaoGenerico;
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;


@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(unitName="bancoA")  
    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;
        }
    }
}

ele insere o entitymanager para o bancoA e como implementao o bancoB neste mesmo local? tendo suas funcionalidades de CRUD assim como o entitymanager ?

S

Ou devo criar outro DAOGenericoImp e 2 classes implementar o meu DAOGenerico?

Hebert_Coelho

romarcio:
Você deve ter apenas um DAO Generico.
+1

Não seria mais fácil ter dois persistence units mapeados no persistence.xml? E com isso ter dois EntityMangers?

S

Eu ja tenho veja

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="bancoA" />
    </bean>
    
    <bean id="entityManagerFactory2" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="bancoB" />
    </bean>

mas i ai?

S

Ai que esta a duvida devo criar 2 DAOGenericoImp um para cada entitymanager ?

Hebert_Coelho

samuelM:
Ai que esta a duvida devo criar 2 DAOGenericoImp um para cada entitymanager ?

Não.

Utilize os dois no mesmo DAO.

S

Entendi e ai quando fizer

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

faco um

@Override
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public T atualizar2(T object) { // METODO 2
        getEntityManager2().merge(object); // pega a entidade 2
        return object;
    }

e crio 2 gets

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

e

protected EntityManager getEntityManager2() {
        if (entityManager2 == null) {
            throw new IllegalStateException("Erro");
        }
        return entityManage2r;
    }

???

S

resumindo duas @PersistenceContext

S

Criado mas agora estou tomando o seguinte erro:

2012-10-13 01:46:12,353 [http-bio-8084-exec-8]  WARN org.springframework.web.context.request.FacesRequestAttributes:121 - Could not register destruction callback [org.springframework.beans.factory.support.DisposableBeanAdapter@10a3404] for attribute 'loginController' because FacesRequestAttributes does not support such callbacks
2012-10-13 01:46:20,107 [http-bio-8084-exec-9]  WARN org.springframework.web.context.request.FacesRequestAttributes:121 - Could not register destruction callback [org.springframework.beans.factory.support.DisposableBeanAdapter@543a03] for attribute 'pesquisaController' because FacesRequestAttributes does not support such callbacks
2012-10-13 01:46:21,324 [http-bio-8084-exec-7]  WARN org.springframework.web.context.request.FacesRequestAttributes:121 - Could not register destruction callback [org.springframework.beans.factory.support.DisposableBeanAdapter@1322efd] for attribute 'pacienteController' because FacesRequestAttributes does not support such callbacks
2012-10-13 01:46:21,332 [http-bio-8084-exec-7]  WARN org.springframework.web.context.request.FacesRequestAttributes:121 - Could not register destruction callback [org.springframework.beans.factory.support.DisposableBeanAdapter@cf9d30] for attribute 'pesquisaController' because FacesRequestAttributes does not support such callbacks
2012-10-13 01:46:22,131 [http-bio-8084-exec-12]  WARN org.springframework.web.context.request.FacesRequestAttributes:121 - Could not register destruction callback [org.springframework.beans.factory.support.DisposableBeanAdapter@81f6c6] for attribute 'pesquisaController' because FacesRequestAttributes does not support such callbacks
2012-10-13 01:46:31,812 [http-bio-8084-exec-12]  WARN org.springframework.web.context.request.FacesRequestAttributes:121 - Could not register destruction callback [org.springframework.beans.factory.support.DisposableBeanAdapter@1e621a0] for attribute 'pesquisaController' because FacesRequestAttributes does not support such callbacks
S

OBS: este erro eu tomo ja estando logado entao ja usando a entity1 e quando vou pesquisar no caso usar a entity2

guijocargo

na minha opinião (detalhe: sei um basico do basico desses frameworks pra ta opinando kkkk), não seria melhor ‘fundir’ esse métodos?
redundante os pares de métodos, como são apenas dois diferentes um parametro booleano pra definir qual voce quer ou ainda fazer alguma comparacao dentro do metodo (tipo instanceof)

apenas sapeando por aki :stuck_out_tongue:

:slight_smile:

luksrn

Não acho muito interessante “usar os dois no mesmo dao”. Como você tá usando Spring, aconselho você criar um bean para cada EntityManager. Se for o caso querer usar o @PersistenceContext(unitName=“banco?”) você pode usar herança para definir esses atributos e depois mapear cada bean no Spring.

S

Certo ja estou usando um bean para cada entitymanager assim como vc pode ver no exemplo, agora n entnedi uma coisa entao posso criar 2 @PersistenceContext(unitName="banco1 e banco2 um para cada banco na classe q implementa meu DAOGenerico ?

Criado 12 de outubro de 2012
Ultima resposta 13 de out. de 2012
Respostas 14
Participantes 5