Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Resultado errado :(

Segue a baixo meu código

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Conta {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String titular;
    private String banco;
    private String agencia;
    private String numero;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getTitular() {
        return titular;
    }
    public void setTitular(String titular) {
        this.titular = titular;
    }
    public String getBanco() {
        return banco;
    }
    public void setBanco(String banco) {
        this.banco = banco;
    }
    public String getAgencia() {
        return agencia;
    }
    public void setAgencia(String agencia) {
        this.agencia = agencia;
    }
    public String getNumero() {
        return numero;
    }
    public void setNumero(String numero) {
        this.numero = numero;
    }
    @Override
    public String toString() {
        return String.format("[%d %s %s %s %s]"  , id, titular, banco, numero, agencia);
    }

}
import java.math.BigDecimal;
import java.util.Calendar;

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Movimentacao {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    @Temporal(TemporalType.DATE)
    private Calendar data;
    @Enumerated(EnumType.STRING)
    private tipoDeMovimentacao tipoDeMovimentacao;
    private BigDecimal valor;
    private String descricao;
    @ManyToOne
    private Conta conta = new Conta();

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Calendar getData() {
        return data;
    }
    public void setData(Calendar data) {
        this.data = data;
    }
    public tipoDeMovimentacao getTipoDeMovimentacao() {
        return tipoDeMovimentacao;
    }
    public void setTipoDeMovimentacao(tipoDeMovimentacao tipoDeMovimentacao) {
        this.tipoDeMovimentacao = tipoDeMovimentacao;
    }
    public BigDecimal getValor() {
        return valor;
    }
    public void setValor(BigDecimal valor) {
        this.valor = valor;
    }
    public String getDescricao() {
        return descricao;
    }
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    public Conta getConta() {
        return conta;
    }
    public void setConta(Conta conta) {
        this.conta = conta;
    }

}

import java.math.BigDecimal;
import java.util.Calendar;

import javax.persistence.EntityManager;

import br.com.bercalini.jpa.JPAUtil;
import br.com.bercalini.modelo.financas.Conta;
import br.com.bercalini.modelo.financas.Movimentacao;
import br.com.bercalini.modelo.financas.tipoDeMovimentacao;

public class TestaRelacionamento {
    public static void main(String[] args) {

        Conta conta = new Conta();
        conta.setAgencia("99999");
        conta.setBanco("ITAU");
        conta.setNumero("99999");
        conta.setTitular("TESTE1");

import javax.persistence.EntityManager;

import br.com.bercalini.jpa.JPAUtil; import br.com.bercalini.modelo.financas.Conta;

public class TesteConta { public static void main(String[] args) {

Conta conta = new Conta(); conta.setAgencia("99999"); conta.setBanco("ITAU"); conta.setNumero("99999"); conta.setTitular("TESTE1");

EntityManager em = new JPAUtil().geEntityManager(); em.getTransaction().begin(); em.persist(conta); em.getTransaction().commit(); em.close(); } }


        Movimentacao movimentacao = new Movimentacao();
        movimentacao.setData(Calendar.getInstance());
        movimentacao.setDescricao("Pagar luz");
        movimentacao.setTipoDeMovimentacao(tipoDeMovimentacao.SAIDA);
        movimentacao.setValor(new BigDecimal(123.9));
        movimentacao.setId(1);
        movimentacao.setConta(conta);


        EntityManager em = new JPAUtil().geEntityManager();
        em.getTransaction().begin();
        em.persist(conta);
        em.persist(movimentacao);
        em.getTransaction().commit();
        em.close();
    }
}

fiz o meu populaConta e salvei os resultado no banco, aqui salvei 5 usuario.

1    99999    ITAU    99999    TESTE1
2    99999    ITAU    99999    TESTE2
3    99999    ITAU    99999    TESTE3
4    99999    ITAU    99999    TESTE4
5    99999    ITAU    99999    TESTE5

Até aqui tudo bem, depois eu vo popular a movimetancao e salvar no banco.

1    2016-09-14    Pagar luz    SAIDA    123.90    6
2    2016-09-14    PAGAR AGUA    SAIDA    123.90    7

E como visto o meu id da conta na tabela movimentacao, ele esta aumento cada vez 1, e era para mostrar o id da conta e não incrementar. :( onde esta o erro?

7 respostas

Parece que no seu código que testa a movimentação você insere a conta de novo... Por isso os novos ids

Alberto entao eu devo remover o codigo de inserir a conta?

Quando tiro o manager.persist(conta); no meu teste movimentacao ele da erro :( o erro e do transient

Exception in thread "main" javax.persistence.RollbackException: Error while committing the transaction
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:92)
    at br.com.bercalini.teste.TestaRelacionamento.main(TestaRelacionamento.java:33)
Caused by: java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing: br.com.bercalini.modelo.financas.Movimentacao.conta -> br.com.bercalini.modelo.financas.Conta
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1384)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:80)
    ... 1 more
Caused by: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing: br.com.bercalini.modelo.financas.Movimentacao.conta -> br.com.bercalini.modelo.financas.Conta
    at org.hibernate.engine.spi.CascadingAction$8.noCascade(CascadingAction.java:380)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:176)
    at org.hibernate.event.internal.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:161)
    at org.hibernate.event.internal.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:152)
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1233)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:403)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:75)
    ... 1 more
solução!

Você precisa associar uma conta que esteja gerenciada... Tenta assim:

    Conta conta = em.find(Conta.class,1);
    movimentacao.setConta(conta);

Alberto deu certo agora, muito obrigado, nessa parte eu to meio perdido, sera que é normal no começo de hibernate? obrigado pela sua ajuda, era isso que faltava para continuar

Acho que é normal sim, o conceito sim só fica mais claro quando você está bom de orientação a objetos e modelo relacional. A ideia é que vc estude para não parecer mágica... Entender os estados que o Hibernate deixa seu objeto é fundamental e tudo mais..

Tá certo, obrigado mais uma vez!