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