[RESOLVIDO] EclipseLink - JPA - merge executa porém não persiste no banco
21 respostas
S
sciuba
Bom dia a Todos,
Estou implementando um projeto em JSF2 e utilizo JPA2 para a persistência. Para o Jpa eu estou utilizando o eclipseLink.
Estou com o seguinte problema para efetuar as consultas no Banco de Dados ( MySql ) tudo funciona normalmente mas no momento de de alterar alguma entidade do banco ou persistir um novo objeto o .merge() não esta fazendo, o engraçado é que não da erro algum ele executa normalmente ai quando pesquiso no Banco vejo que nada foi alterado.
Alguém ja passou por isso!? ou sabe onde pode estar o problema!
posta sua entidade ai, provavelmente ta faltando anotações
t+
C
CharlesAlves
O commit está sendo executado?!
S
sciuba
Infelizmente não estou com o meu projeto aqui no trabalho, hoje a noite eu posto !
e CharlesAlves me desculpe a minha falta de conhecimento mas comit não é so para o hibernate? com o jpa simplesmente o merge ja não deveria funcionar?
Obrigado
M
maior_abandonado
não… o você precisa abrir a transação, fazer o que tiver que fazer e caso tenha alguma alteração(inserção, deleção ou alteração mesmo), alguma coisa diferente de consulta você precisa comitar, seja com hibernate, eclipselink, jdbc ou o que for… você só não vai precisar commitar caso o commit esteja automático, de novo em qualquer tecnologia que você estiver usando, isso é configuravel.
S
sciuba
Segue classes do meu projeto Entity, EntityManager, Service e o persistence.xml
publicclassClienteServiceImplextendsJpaManagerimplementsClienteService{@OverridepublicList<Cliente>pesquisaClientes(){List<Cliente>listaCliente=newArrayList<Cliente>();StringsqlQuery="select cliente from Cliente cliente";Queryquery=getEntityManager().createQuery(sqlQuery);listaCliente=query.getResultList();returnlistaCliente;}@OverridepublicvoidsalvaCliente(Clientecliente){getEntityManager().merge(cliente);}@OverridepublicvoidalteraCliente(Clientecliente){//TODO: Verificar metodoClienteclientePesquisa=pesquisaCliente(cliente.getCpfCnpj());clientePesquisa.setContato1(cliente.getContato1());clientePesquisa.setContato2(cliente.getContato2());clientePesquisa.setEmail(cliente.getEmail());clientePesquisa.setEndereco(cliente.getEndereco());clientePesquisa.setTelContato1(cliente.getTelContato1());clientePesquisa.setTelContato2(cliente.getTelContato2());clientePesquisa.setTelefone(cliente.getTelefone());try{getEntityManager().merge(clientePesquisa);}catch(Exceptione){e.printStackTrace();}}@OverridepublicClientepesquisaCliente(StringcpfCnpj){StringsqlQuery="select cliente from Cliente cliente where cliente.cpfCnpj in('"+cpfCnpj+"')";Queryquery=getEntityManager().createQuery(sqlQuery);Clientecliente=(Cliente)query.getSingleResult();returncliente;}@OverridepublicvoidremoveCliente(Clientecliente){getEntityManager().remove(cliente);}}
Como configuro isso no container eu gostaria mesmo que funciona-se assim!?
Muito Obrigado Pela Ajuda!
Vlw
A
alissonvla
cara,
como vc ta usando a versão do Jee 6, vc pode colocar sua camada de regra de negocio para usar EJB, para isso basta vc anotar sua classe com @Stateless e na sua camada de persistencia, DAO, basta vc injetar entitymanager com @PersistenceContext.
espero q ajude.
t+
S
sciuba
OI Alison
Então sim é JEE6 e eu ja estou com o @PersistenceContext no meu EntityManager agora o @Stateless isso eu não sabia pensei que fosse somente para o uso de EJBs
Vou testar aqui e daqui a pouco posto a resposta!
Obrigado Mais uma vez
Vlw
A
alissonvla
sim, vc ta certo, stateless é para uso de EJB, mas na versão JEE6, vc pode usar ejb com web container.
t+
S
sciuba
Nada Feito
ainda da o mesmo erro: No transaction is currently active
Inverti la atrás colocando o getEntityManager().getTransaction().begin
Para depois o merge e o comit e mesmo assim deu o mesmo erro!
Coloquei a clase de negocio com o @Stateful poi o @Stateless como havia me dito não aparece pra mim o IDE não encontra.
Não imaginava que seria tão dificil fazer isso funcionar direito!
Por favor alguém ai tem alguma ideia do que pode estar ocorrendo
Obrigado
A
alissonvla
cara,
tem algo de estranho no seu projeto ai, pois como ele acha @Stateful e nao acha @Stateless e quando vc usa transação gerenciada pelo container, vc nao precisa dar getTransaction, vc so vair usar o merge e depois flush.
e vi um mero detalhe que fez toda a diferença em vez de pegar o getEntityManager diretamente da superclasse eu instanciei um Objeto do tipo EntityManager passando o valor o getEntityManager da super classe e funcionou!