[RESOLVIDO] EclipseLink - JPA - merge executa porém não persiste no banco

21 respostas
S

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!

Obrigado pela atenção de todos!

Abraço

21 Respostas

A

Cara,

posta sua entidade ai, provavelmente ta faltando anotações

t+

C

O commit está sendo executado?!

S

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

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

Segue classes do meu projeto Entity, EntityManager, Service e o persistence.xml

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Conesul" transaction-type="RESOURCE_LOCAL">
		<class>br.com.conesul.entity.Usuario</class>
		<class>br.com.conesul.entity.Cliente</class>
		<class>br.com.conesul.entity.Os</class>
		<class>br.com.conesul.entity.Parcela</class>
		
		<properties>
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/conesul"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password" value="system32"/>
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="ALL"/>
		</properties>
	</persistence-unit>
</persistence>

Entity

@Entity
@Table(name="tab_cliente")
public class Cliente implements Serializable {

	   
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO) 
	@Column(name="cd_cliente")
	private int cdCliente;
	
	@OneToMany(mappedBy="cdCliente")
	private Set<Os> cdOs;
	
	@Column(name="nm_cliente")
	private String nmCliente;
	
	@Column(name="tp_cliente")
	private String tpCliente;
	
	@Column(name="endereco")
	private String endereco;
	
	@Column(name="telefone")
	private String telefone;
	
	@Column(name="contato1")
	private String contato1;
	
	@Column(name="contato2")
	private String contato2;
	
	@Column(name="tel_contato1")
	private String telContato1;
	
	@Column(name="tel_contato2")
	private String telContato2;
	
	@Column(name="cpf_cnpj")
	private String cpfCnpj;
		
	@Column(name="email")
	private String email;

//getters// setters

Service

public class ClienteServiceImpl extends JpaManager implements ClienteService {

	@Override
	public List<Cliente> pesquisaClientes() {
		
		List<Cliente> listaCliente = new ArrayList<Cliente>();
		
		String sqlQuery = "select cliente from Cliente cliente";
		
		Query query = getEntityManager().createQuery(sqlQuery);
		
		listaCliente = query.getResultList();
		
		return listaCliente;
	}

	@Override
	public void salvaCliente(Cliente cliente) {
		
		getEntityManager().merge(cliente);
		
	}

	@Override
	public void alteraCliente(Cliente cliente) { //TODO: Verificar metodo
		
		Cliente clientePesquisa = 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(Exception e){
			e.printStackTrace();
		}
		
		
	}

	@Override
	public Cliente pesquisaCliente(String cpfCnpj) {
		
		String sqlQuery = "select cliente from Cliente cliente where cliente.cpfCnpj in('"+cpfCnpj+"')";
		
		Query query = getEntityManager().createQuery(sqlQuery);
		
		Cliente cliente = (Cliente) query.getSingleResult();
		
		return cliente;
	}

	@Override
	public void removeCliente(Cliente cliente) {
		
		getEntityManager().remove(cliente);		
	}
	
	

}

Entity Manager

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;

public class JpaManager {
	
	@PersistenceContext
	private EntityManagerFactory emf = Persistence.createEntityManagerFactory("Conesul"); 

    public EntityManager getEntityManager(){

            return emf.createEntityManager();
    }

Onde vocês acham que o problema pode estar?

Obrigado

S

Bom dia pessoal!

Alguém sabe oque pode estar acontecendo!?

Obrigado

S

Por favor Alguém!!!

P
S

pmlm

Onde ele deveria estar sendo executado ? eu não configurei nada referente ao commit! como deveria configurar isso!?

Obrigado kra

A

Cara faz o seguinte

@Entity
@Table(name="tab_cliente")
public class Cliente implements Serializable {

	   
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO) 
	@Column(name="cd_cliente")
	private int cdCliente;
	
	@OneToMany(mappedBy="cdCliente", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	private Set<Os> cdOs;
	
	@Column(name="nm_cliente")
	private String nmCliente;
	
	@Column(name="tp_cliente")
	private String tpCliente;
	
	@Column(name="endereco")
	private String endereco;
	
	@Column(name="telefone")
	private String telefone;
	
	@Column(name="contato1")
	private String contato1;
	
	@Column(name="contato2")
	private String contato2;
	
	@Column(name="tel_contato1")
	private String telContato1;
	
	@Column(name="tel_contato2")
	private String telContato2;
	
	@Column(name="cpf_cnpj")
	private String cpfCnpj;
		
	@Column(name="email")
	private String email;

//getters// setters

e na Classe Os

@JoinColumn(name = "CHAVE_ESTRAGERIA", referencedColumnName = "CHAVE_PRIMARIA")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Cliente cdCliente;

e testa ai

t+

S

Ok Alison vou testar hoje a noite e posto o resultado!

Obrigado

S

Fiz o procedimento acima porém não obtive sucesso !

agora implementei o seguinte:

getEntityManager.merge(clientePesquisa);

getEntityManager.getTransactional.begin();

getEntityManager.getTransactional.comit();

ou

getEntityManager.flush();

porém tanto na primeira opção e na segunda me devolve o seguinte erro : No transaction is currently active

Como faço para configurar isso no JSF corretamente ?

Obrigado

A

cara,

vc fez errado, vc tinha q fazer assim

try{
getEntityManager.getTransactional.begin();
getEntityManager.merge(clientePesquisa);
getEntityManager.getTransactional.comit();
} catch(Exception e){
e.printstacktrace();
getEntityManager.getTransactional.roolback();
}

pq vc nao deixa o container gerenciar a transação para vc, fica melhor.

t+

S

Oi Alison obrigado pela ajuda vou testar !

eu estou usando JSF2 + primeFaces + JPA2 (EclipseLink) + TomCat 7

Como configuro isso no container eu gostaria mesmo que funciona-se assim!?

Muito Obrigado Pela Ajuda!

Vlw

A

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

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

sim, vc ta certo, stateless é para uso de EJB, mas na versão JEE6, vc pode usar ejb com web container.

t+

S

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

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.

da uma olhada ai direitinho.

t+

S

Kra finalmente consegui!!! :smiley:

Depois de muito tentar vi um exemplo no site http://blog.camilolopes.com.br/jpa-com-hibernate-jsf-mysql/

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!

EntityManager em = getEntityManager();

em.getTransaction.begin();

em.merge(clientePesquisa);

em.getTransaction.commit();

e Finalmente Funcionou sobre o Stateless eu vou dar uma olhada nisso!

Obrigado a todos e especialmente ao Alisson que teve muita paciencia como meu caso! Vlw Veio!

A

que bom q deu certo… :lol:

Criado 22 de setembro de 2011
Ultima resposta 29 de set. de 2011
Respostas 21
Participantes 5