Eu esotu desenvolvendo o meu primeiro CRUD genérico em JPA e estou com uma dúvida que não estou conseguindo resolver,
para atualizar ou remove um objeto no JPA eu preciso encontra-lo primeiro pelo seu ID e depois atualiza-lo ou exclui-lo neh verdade?
O problema é que eu não estou conseguindo fazer a busca pelo ID usando o JPA
Mas não adiantou e até agora não consegui implementar a busca por ID usando o JPA.
Será que alguém poderia me dar uma ajuda?
[]'s.
nel
Oi.
Ricardo, se está usando Generics porque precisa converter o Generic em Objetc e retornar esse Object sendo que o seu método retorna um Generic?
Algo tão importante quanto isso, é se você já leu sobre o método find do EntityManager.
A classe que é informando no método find deve ser um @Entity e representa a entidade que desejas retornar, sendo assim, se faz necessário que informe o que está buscando. Creio que se quer algo tão genérico não deves usar o find, mas fazer como uma query qualquer.
Abraços.
nel
Só para deixar claro o que eu quero dizer, se você envia uma classe “genérica” ao find, como ele vai descobrir qual tabela ele deve consultar através da PK? Por mágica que não será, concorda?
Uma sugestão, é você alterar a assinatura do seu método, assim:
publicclassGenericDAOImp<T,IDextendsSerializable>implementsGenericDAO<T,ID>{@PersistenceContextprivateEntityManagerentityManager;privatefinalClass<T>classePersistente;publicGenericDAOImp(){this.classePersistente=(Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];}publicClass<T>getClassePersistente(){returnclassePersistente;}protectedfinalCriteriacriaCriteria(){returncriaSession().createCriteria(getClassePersistente());}publicfinalSessioncriaSession(){return(Session)getEntityManager().getDelegate();}publicEntityManagergetEntityManager(){returnentityManager;}publicvoidsetEntityManager(EntityManagerentityManager){this.entityManager=entityManager;}@OverridepublicClass<T>getObjectClass(){returnthis.classePersistente;}@Override@Transactional(readOnly=false,propagation=Propagation.REQUIRED)publicTsalvar(Tobject){getEntityManager().clear();try{getEntityManager().persist(object);}catch(Exceptione){e.printStackTrace();}returnobject;}@SuppressWarnings("unchecked")publicList<T>todos(Stringordem){StringBufferqueryS=newStringBuffer("SELECT obj FROM "+classePersistente.getSimpleName()+" obj ");if(ordem!=null){queryS.append("order by "+ordem);}Queryquery=getEntityManager().createQuery(queryS.toString());returnquery.getResultList();}@Override@Transactional(readOnly=false,propagation=Propagation.REQUIRED)publicTatualizar(Tobject){getEntityManager().merge(object);returnnull;}@Override@Transactional(readOnly=false,propagation=Propagation.REQUIRED)publicTexcluir(Tobject){try{object=getEntityManager().merge(object);getEntityManager().remove(object);}catch(Exceptione){e.printStackTrace();}returnnull;}@Override@Transactional(readOnly=false,propagation=Propagation.REQUIRED)publicTfindById(IDid){returngetEntityManager().find(getClassePersistente(),id);}
ricardocomp
Falaaa nel e raf4ever, eu estou fazendo assim e modifiquei o meu código
de acordo com o q o nel falou
Agora preciso testar o meu excluir e o meu atualizar alguém conhece alguma forma mais prática e melhor de testar o CRUD?
[]'s.
nel
Devemos entender que deu certo?
E o pessoal costuma utilizar um componente chamado JUnit para realização de testes.
É muito interessante, é uma API via Annotation e que você pode montar vários ambientes de testes.
Mas precisa de paciência e atenção para montar os testes.
Abraços.
ricardocomp
Valeu nel e raf4ever e MUITO OBRIGADO pela ajuda de vc’s,