[RESOLVIDO] Problema com relacionamento JPA (Unable to find Entity with id)

3 respostas Resolvido
hibernatejpa
C

Opa, não sou muito de pedir ajuda, mas esse problema que venho enfrentando realmente tem me dado dor de cabeça. Ja achei tópicos parecidos, mas que não resolveram minha situação)

Contexto:
Estou desenvolvendo um projeto de gerenciador de contas e no controller de movimento acabei achando uma grande dor de cabeça na hora de inserir um movimento, e alterar o cartão inserindo este movimento na sua “lista” de movimentos.

Solução:
Basicamente oq fiz, foi remover a linha em que o DAO estava alterando a entidade, pois ela ja fazia isso automaticamente ao chamar o método que atribuia uma compra ao cartão

De forma mais detalhada:
A entidade cartão possui uma lista de movimentos (compras feitas no cartão) que vai ser alterada e acrescida toda vez que um novo movimento com o procedimento de “compraCartao” for inserido. A entidade de movimento, por sua vez, possui um campo do cartão que esta sendo realizada a compra.
Quando realizada a inserção (inclusão do movimento primeiro e depois a alteração do cartão) o programa retorna uma exception, dizendo não ter achado o registro que inseri anteriormente para fazer a relação. Não sei onde esta o problema, ja tentei criar uma thread, inverter a ordem dos processos, ja tentei mexer nas anotações e nada!

Código da entidade Cartão:
package model.entities;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "cartao")
public class Cartao {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "codi_cartao")
	private Long codi;
	@Column(name = "fatu_cartao")
	private Date fatu;
	@Column(name = "nome_cartao")
	private String nome;
	@Column(name = "vali_cartao")
	private Date vali;
	@Column(name = "limi_cartao")
	private Double limite;
	@OneToMany(mappedBy = "cartao")
	private List<Movimento> compras = new ArrayList<>();
	@Column(name = "status_cartao")
	private String status;
	
	
	
	public Cartao() {
		// TODO Auto-generated constructor stub
	}

	
	public Cartao(Date fatu, String nome, Date vali, String status) {
		super();
		this.fatu = fatu;
		this.nome = nome;
		this.vali = vali;
		this.status = status;
	}


	public Date getFatu() {
		return fatu;
	}


	public void setFatu(Date fatu) {
		this.fatu = fatu;
	}


	public String getNome() {
		return nome;
	}


	public void setNome(String nome) {
		this.nome = nome;
	}


	public Date getVali() {
		return vali;
	}


	public void setVali(Date vali) {
		this.vali = vali;
	}
	
	public Double getLimite() {
		return limite;
	}


	public void setLimite(Double limite) {
		this.limite = limite;
	}


	public List<Movimento> getCompras() {
		return compras;
	}


	public void setCompras(List<Movimento> compras) {
		this.compras = compras;
	}
	
	public void setCompra(Movimento compra) {
		if(compra == null) return;
		
		this.compras.add(compra);
	}


	public String getStatus() {
		return status;
	}


	public void setStatus(String status) {
		this.status = status;
	}
	
	public Double getTotalCompras() {
		Double valor = 0.0;
		for (Movimento m : getComprasAbertas()) {
			valor += m.getValor();
		}
		return valor == null? 0.0 : valor;
	}
	
	public List<Movimento> getComprasAbertas(){
		List<Movimento> abertas = new ArrayList<Movimento>();
		for (Movimento m : compras) {
			if(m.getParc() > m.getPagas()) {
				abertas.add(m);
			}
		}
		return abertas;
	}


	@Override
	public String toString() {
		return this.nome;
	}
	
}

Código da entidade Movimento:
package model.entities;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import model.enums.TiposCate;

@Entity
@Table(name = "movimentos")
public class Movimento {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "codi_movi")
	private Long codi;
	
	@Temporal(TemporalType.DATE)
	@Column(name = "data_movi")
	private Date data;
	@Column(name = "desc_movi")
	private String desc;
	@Column(name = "cate_movi")
	private TiposCate cate;
	@ManyToOne
	private Cartao cartao;
	@OneToOne
	private Conta conta;
	@Column(name = "parc_movi")
	private Integer parc;
	@Column(name = "parc_pagas_movi")
	private Integer pagas;
	@Column(name = "valor_parc_movi")
	private Double valor;
	@Column(name = "proce_movi")
	private String proce;
	
	public Movimento() {
		// TODO Auto-generated constructor stub
	}
	
	


	
	public Long getCodi() {
		return codi;
	}


	public Cartao getCartao() {
		return cartao;
	}


	public void setCartao(Cartao cartao) {
		this.cartao = cartao;
	}


	public Date getData() {
		return data;
	}


	public void setData(Date data) {
		this.data = data;
	}

	public String getDesc() {
		return desc;
	}


	public void setDesc(String desc) {
		this.desc = desc;
	}


	public TiposCate getCate() {
		return cate;
	}


	public void setCate(TiposCate cate) {
		this.cate = cate;
	}


	public Conta getConta() {
		return conta;
	}


	public void setConta(Conta conta) {
		this.conta = conta;
	}

	
	public Integer getParc() {
		return parc;
	}

	
	public void setParc(Integer parc) {
		this.parc = parc;
	}

	
	public Integer getPagas() {
		return pagas;
	}



	public void setPagas(Integer pagas) {
		this.pagas = pagas;
	}



	public Double getValor() {
		return valor;
	}


	public void setValor(Double valor) {
		this.valor = valor;
	}
	
	
	
	public String getProce() {
		return proce;
	}



	public void setProce(String proce) {
		this.proce = proce;
	}



	public Double getValorAju() {
		if(cate.getIndice() == 0) {
			return valor * -1;
		} 
		return valor;
	}


	public Double getTotal() {
		return valor * parc;
	}
	
	
	public Double getRestante() {
		return (valor * parc) - (valor * pagas);
	}



	@Override
	public String toString() {
		return this.desc;
	}
	
}

Exceção gerada:
> Caused by: javax.persistence.EntityNotFoundException: Unable to find model.entities.Movimento with id 1

at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$JpaEntityNotFoundDelegate.handleEntityNotFound(EntityManagerFactoryBuilderImpl.java:163)
    	at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:216)
    	at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:332)
    	at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:108)
    	at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74)
    	at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:113)
    	at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1184)
    	at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1049)
    	at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:697)
    	at org.hibernate.type.EntityType.resolve(EntityType.java:464)
    	at org.hibernate.type.ManyToOneType.resolve(ManyToOneType.java:240)
    	at org.hibernate.type.EntityType.resolve(EntityType.java:457)
    	at org.hibernate.type.EntityType.replace(EntityType.java:358)
    	at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:587)
    	at org.hibernate.type.CollectionType.replace(CollectionType.java:750)
    	at org.hibernate.type.TypeHelper.replace(TypeHelper.java:167)
    	at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:451)
    	at org.hibernate.event.internal.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:205)
    	at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:178)
    	at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:70)
    	at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)
    	at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:791)
    	at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:778)
    	at model.DAO.alterar(DAO.java:71)
    	at model.DAO.alterarAgora(DAO.java:76)
    	at controller.MoviController.salvar(MoviController.java:320)

Agradeço desde já a atenção

3 Respostas

H

posta o codigo da classe que tem a compraCartao, além das classe que ela chamar.

pmlm

Se é aqui que estão os problemas, mostra o código desses dao.consultarUm e daoCar.alterarAgora

C
Solucao aceita

Solução:
Basicamente oq fiz, foi remover a linha em que o DAO estava alterando a entidade, pois ela ja fazia isso automaticamente ao chamar o método que atribuia uma compra ao cartão

Criado 10 de março de 2021
Ultima resposta 12 de mar. de 2021
Respostas 3
Participantes 3