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.
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. */packagebr.com.imc.dao.imp;/** * * @author samuelM */importbr.com.imc.dao.DaoGenerico;importjava.io.Serializable;importjava.lang.reflect.ParameterizedType;importjava.util.List;importjava.util.Map;importjavax.persistence.EntityManager;importjavax.persistence.NoResultException;importjavax.persistence.PersistenceContext;importjavax.persistence.Query;importorg.springframework.transaction.annotation.Propagation;importorg.springframework.transaction.annotation.Transactional;@Transactional(readOnly=true,propagation=Propagation.REQUIRED)publicclassDaoGenericoImp<T,IDextendsSerializable>implementsDaoGenerico<T,ID>{privateEntityManagerentityManager;privatefinalClass<T>oClass;//object classpublicClass<T>getObjectClass(){returnthis.oClass;}@SuppressWarnings("unchecked")@PersistenceContext(unitName="bancoA")publicvoidsetEntityManager(EntityManagerem){this.entityManager=em;}protectedEntityManagergetEntityManager(){if(entityManager==null){thrownewIllegalStateException("Erro");}returnentityManager;}@SuppressWarnings("unchecked")publicDaoGenericoImp(){this.oClass=(Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];}@Override@Transactional(readOnly=false,propagation=Propagation.REQUIRED)publicTatualizar(Tobject){getEntityManager().merge(object);returnobject;}@Override@Transactional(readOnly=false,propagation=Propagation.REQUIRED)publicvoidexcluir(Tobject){object=getEntityManager().merge(object);getEntityManager().remove(object);}@OverridepublicTpesquisarPorId(IDid){return(T)getEntityManager().find(oClass,id);}@Override@Transactional(readOnly=false,propagation=Propagation.REQUIRED)publicTsalvar(Tobject){getEntityManager().clear();getEntityManager().persist(object);returnobject;}@SuppressWarnings("unchecked")publicList<T>todos(){StringqueryS="SELECT obj FROM "+oClass.getSimpleName()+" obj";Queryquery=getEntityManager().createQuery(queryS);returnquery.getResultList();}@SuppressWarnings("unchecked")publicList<T>listPesqParam(Stringquery,Map<String,Object>params){Queryq=getEntityManager().createQuery(query);for(Stringchave:params.keySet()){q.setParameter(chave,params.get(chave));}returnq.getResultList();}@SuppressWarnings("unchecked")publicList<T>listPesqParam(Stringquery,Map<String,Object>params,intmaximo,intatual){Queryq=getEntityManager().createQuery(query).setMaxResults(maximo).setFirstResult(atual);for(Stringchave:params.keySet()){q.setParameter(chave,params.get(chave));}returnq.getResultList();}@SuppressWarnings("unchecked")publicList<T>listPesq(Stringquery){Queryq=getEntityManager().createQuery(query);returnq.getResultList();}@SuppressWarnings("unchecked")publicTpesqParam(Stringquery,Map<String,Object>params){Queryq=getEntityManager().createQuery(query);for(Stringchave:params.keySet()){q.setParameter(chave,params.get(chave));}try{return(T)q.getSingleResult();}catch(NoResultExceptionnre){returnnull;}}}
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
samuelM
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?
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
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
samuelM
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 ?