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

Necessidade de dar um item.setPedido(this)

Quando eu crio um ItemPedido, já não passo o Pedido:

public void ItemPedido(int quantidade, Pedido pedido, Produto produto) {
        this.quantidade = quantidade;
        this.produto = produto;  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        this.pedido = pedido;
        this.precoUnitario = produto.getPreco();
    }

Não entendi por que precisa dar um "item.setPedido", passando o Pedido novamente. Se eu quisesse dar um ItemPedido.getPedido(), antes de adicionarItem, já nao retornaria o pedido? Então por que fazer isso novamente?? Não sobrescreveria a informação, não?

public void adicionarItem(ItemPedido item) {
        item.setPedido(this); <<<<<<<<<<<<<<<<<<<<<<<<<<<<
        this.itens.add(item);
}
3 respostas

Oi Rodrigo!

Entendo a sua dúvida, e ela é bastante comum quando estamos lidando com associações bidirecionais em Java, especialmente em um contexto de JPA (Java Persistence API).

Quando você cria um ItemPedido e passa o Pedido no construtor, você está estabelecendo uma relação do ponto de vista do ItemPedido. No entanto, quando você adiciona esse ItemPedido a um Pedido usando o método adicionarItem, você precisa garantir que a relação esteja consistente dos dois lados.

O método item.setPedido(this) dentro de adicionarItem está ali para garantir que o Pedido também saiba que ele tem esse ItemPedido associado a ele. Isso é importante para manter a integridade da relação bidirecional. Sem essa linha, o ItemPedido saberia que pertence a um Pedido, mas o Pedido não teria conhecimento de que possui aquele ItemPedido específico na sua lista de itens.

Por exemplo, imagine que você tem um pedido e adiciona um item a ele. Se você não fizer item.setPedido(this), ao consultar a lista de itens do pedido, esse item não apareceria, porque o pedido não foi notificado da adição do novo item.

Espero ter ajudado e bons estudos!

Obrigado por responder!

Eu entendi, mas me parece uma redundância, uma vez que, o objeto pedido, passado como argumento no construtor de ItemPedido, no meu entendimento, já possui um identificador/endereço de memória. Quando ocorre item.setPedido(this); dentro de Pedido, parece atualizar esse mesmo endereço de memória de Pedido que já existia, ou seja, o objeto parece ser o mesmo..apenas substitui 6 por meia dúzia.

Enfim, acho que aceitei mais do que entender a necessidade. Mesmo assim, obg!

solução!

Para facilitar o entendimento, imagina que não tem construtor, então para setar os objetos manualmente seria algo como:

Pedido p1 = new Pedido();

ItemPedido item1 = new ItemPedido("Celular", 4, new BigDecimal("2400.00")); //4 celulares com preço unitario de R$2.400,00
ItemPedido item2 = new ItemPedido("computador", 2, new BigDecimal("6500.00"));  //2 computadores com preço unitario de R$6.500,00

Como fazer para relacionar esses objetos? A princípio seria isso:

p1.getItens().add(item1);
p1.getItens().add(item2);

Dessa forma, o pedido p1 tem na lista de itens dele os dois itens. Porém, como o relacionamento é bidirecional, precisa setar também nos objetos itemPedido quem é o pedido deles:

item1.setPedido(p1);
item2.setPedido(p1);

Sem isso, o pedido teria a lista contendo os 2 itens, mas cada item não estaria relacionado com nenhum pedido (estaria null).

Ou seja, o código correto e completo seria assim:

// cria um objeto pedido sem nenhum item:
Pedido p1 = new Pedido();

// Cria um item, porem sem estar relacionado com nenhum pedido:
ItemPedido item1 = new ItemPedido("Celular", 4, new BigDecimal("2400.00"));

//indica para o item1 que ele pertece ao pedido p1:
item1.setPedido(p1);

//indica para o pedido p1 que a lista dele agora tem 1 item adicionado:
p1.getItens().add(item1);


// Cria outro item, porem sem estar relacionado com nenhum pedido:
ItemPedido item2 = new ItemPedido("computador", 2, new BigDecimal("6500.00"));

//indica para o item2 que ele pertece ao pedido p1:
item2.setPedido(p1);

//indica para o pedido p1 que a lista dele agora tem mais 1 item:
p1.getItens().add(item2);

E para garantir que tudo foi relacionado corretamente, você pode imprimir no console:

System.out.println(p1.getItens().size()); //deve imprimir 2 itens

System.out.println(item1.getPedido()); //deve imprimir o pedido p1
System.out.println(item2.getPedido()); //deve imprimir o pedido p1

Bons estudos!