4
respostas

Persistência de Conta e Movimentações

Uma Conta possui uma lista de Movimentações. Ao persistir uma conta as movimentações não deveriam ser persistidas de forma automática? Caso seja possível, como faria?

4 respostas

Opa Aline, não deveria.. só vai ser se vc marcar como cascade type persist/merge.

Aproveitando este tópico, toda vez que eu persisto uma movimentação, além de criar a movimentação duplica a conta. PQ?

nao da para saber sem ver o codigo, Daniel. A movimentacao pode estar associada com uma conta e vc ter usado cascade no relacionamento.. apenas um chute.

package br.com.caelum.financas.util;

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

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

import br.com.caelum.financas.modelo.Conta;
import br.com.caelum.financas.modelo.Movimentacao;
import br.com.caelum.financas.modelo.TipoMovimentacao;

public class PopulaMovimentacao {
    public static void main(String[] args) {
        double inicio = System.currentTimeMillis();

        //conta nova
        Conta conta = new Conta();
        conta.setTitular("José das Couves");
        conta.setBanco("CEF");
        conta.setAgencia("6152");
        conta.setNumero("227620");

        Movimentacao movimentacao = new Movimentacao();
        movimentacao.setData(Calendar.getInstance());
        movimentacao.setDescricao("Conta de luz");
        movimentacao.setTipoMovimentacao(TipoMovimentacao.SAIDA);
        movimentacao.setValor(new BigDecimal("99.89"));
        movimentacao.setConta(conta);

        EntityManager manager = new JPAUtil().getEntityManager();

        manager.getTransaction().begin();
        manager.persist(conta);
        manager.find(Conta.class, 3);
        conta.setTitular("José das Couves");
        manager.getTransaction().commit();


        manager.getTransaction().begin();
        manager.persist(movimentacao);
        manager.getTransaction().commit();

        manager.close();

        double fim = System.currentTimeMillis();
        System.out.println("Executado em: " + (fim - inicio)/1000 + "s");

    }
}

Segue o código da classe. Pelo que estou entendo, toda vez que eu estancio a classe Conta, ele entende como uma nova conta, mesmo eu mudando o estado para managed antes de persistir. Nos exercícios do curso a classe PopulaMovimentacao/TestaMovimentacao estava assim e ele conseguiu gerar várias movimentações para uma única conta e eu não estou conseguindo.