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