Garantindo integridade entre itemvenda com venda JPA

Java

31/07/2014

Boa noite eu estou com duvida ao gravar minha venda está gravando somente a tabela venda e não item venda segue código abaixo gostaria de ajuda:

venda.setTotal(pedidoCarrinho.getTotal());
venda.setCliente(cliente);
venda.setVendedor(vendedor);
venda.setCfop(cfop);
venda.setDataEmissao(new Date());
venda.setEmpresa(empresa);

ItemVenda itemVenda = new ItemVenda();
itemVenda.setProduto(produto);

for (int i = 0; i < pedidoCarrinho.getItensOrdenadosEmLista().size(); i++) {
System.out.println(pedidoCarrinho.getItensOrdenadosEmLista().get(i)
.getProduto().getId());
produto.setId(pedidoCarrinho.getItensOrdenadosEmLista().get(i)
.getProduto().getId());
itemVenda.setVenda(venda);
itemVenda.setDataVenda(new Date());
itemVenda.setPrecoTotal(pedidoCarrinho.getItensOrdenadosEmLista()
.get(i).getPrecoTotal());
itemVenda.setValorUnitario(pedidoCarrinho
.getItensOrdenadosEmLista().get(i).getValorUnitario());
itemVenda.setQuantidade(pedidoCarrinho.getItensOrdenadosEmLista()
.get(i).getQuantidade());
itemVenda.setProduto(produto);
venda.getItens().add(itemVenda);


itemVenda = new ItemVenda();
}

dao.addVenda(venda);


aqui está relacionamento das tabela

@Entity
@Table(name = "itemvenda")
public class ItemVenda implements Serializable, Comparable<ItemVenda> {

private static final long serialVersionUID = -6083937769807378921L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Column(name = "Quantidade")
private Integer quantidade;
@Column(name = "ValorUnitario")
private Double valorUnitario;
@Column(name = "preco_total")
@NotNull
private Double precoTotal;
@Column(name = "data_venda")
private Date dataVenda;
@ManyToOne(cascade = CascadeType.PERSIST, optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "id_produto", nullable = false)
@NotNull
private Produto produto;
@ManyToOne(cascade = CascadeType.PERSIST, optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "id_venda", nullable = false)
@NotNull
private Venda venda;


@Entity
@Table(name = "venda")
public class Venda implements Serializable {

private static final long serialVersionUID = -9186348467323901258L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;

@Column(name = "Total")
private Double total;

@Temporal(value = TemporalType.TIMESTAMP)
private Date dataEmissao;

@ManyToOne
@JoinColumn(name = "idCliente", nullable = false)
@NotNull
private Cliente cliente;

@OneToMany(mappedBy = "venda", cascade = CascadeType.PERSIST)
private Set<ItemVenda> itens;

@ManyToOne(optional = false, cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinColumn(name = "id_empresa")
private Empresa empresa;

@ManyToOne(optional = false, cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinColumn(name = "id_vendedor")
private Vendedor vendedor;

@ManyToOne(optional = false, cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinColumn(name = "id_cfop")
private CFOP cfop;
Adriano Aguiar

Adriano Aguiar

Curtidas 0

Melhor post

Ronaldo Lanhellas

Ronaldo Lanhellas

18/03/2015

Não, sua ideia está um pouco errada sobre a utilização do CascadeType.ALL. No caso quando você inserir uma Venda, os itens serão automaticamente persistidos e quando você deletar essa venda os itens também serão deletados.

Isso não vai influenciar em nada na relação itemVenda -> Produto, pois você não deve usar CASCADE nessa relação, já que os Produtos podem ser utilizados em outras vendas para outros itens.

Aconselho a leitura de um artigo mais detalhado: https://www.devmedia.com.br/cascade-hibernate-conhecendo-diferentes-tipos/28892
GOSTEI 1

Mais Respostas

Ronaldo Lanhellas

Ronaldo Lanhellas

31/07/2014

Tente mudar de CASCADE.PERSIST para CASCADE.ALL, creio que os itens da venda devem ser deletado e atualizados quando houver alteração na venda.

@OneToMany(mappedBy = "venda", cascade = CascadeType.ALL)
private Set<ItemVenda> itens;
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

31/07/2014

Outra coisa, retira o mapped by deixando assim:

@OneToMany( cascade = CascadeType.ALL)
private Set<ItemVenda> itens;
GOSTEI 0
Adriano Aguiar

Adriano Aguiar

31/07/2014

se eu não coloco o mapped ele cria tabela de relaciona venda e item ai fico com 03 tabelas, é certo ?
GOSTEI 0
Adriano Aguiar

Adriano Aguiar

31/07/2014

Boa tarde Ronaldo, fiz a mudanã que você sugeriu mais continuo com mesmo problema tabela venda grava quando não tenho nenhum item no carrinho.


grato!
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

31/07/2014

se eu não coloco o mapped ele cria tabela de relaciona venda e item ai fico com 03 tabelas, é certo ?


Certo meu caro, normalmente fazemos assim.
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

31/07/2014

Tente fazer o seguinte:

List<ItemVenda> itens = new ArrayList<ItemVenda>();

for (int i = 0; i < pedidoCarrinho.getItensOrdenadosEmLista().size(); i++) {
System.out.println(pedidoCarrinho.getItensOrdenadosEmLista().get(i)
.getProduto().getId());
produto.setId(pedidoCarrinho.getItensOrdenadosEmLista().get(i)
.getProduto().getId());
itemVenda.setVenda(venda);
itemVenda.setDataVenda(new Date());
itemVenda.setPrecoTotal(pedidoCarrinho.getItensOrdenadosEmLista()
.get(i).getPrecoTotal());
itemVenda.setValorUnitario(pedidoCarrinho
.getItensOrdenadosEmLista().get(i).getValorUnitario());
itemVenda.setQuantidade(pedidoCarrinho.getItensOrdenadosEmLista()
.get(i).getQuantidade());
itemVenda.setProduto(produto);
itens.add(itemVenda);
itemVenda = new ItemVenda();
}

venda.setItens(itens);
GOSTEI 0
Gabriell Amaral

Gabriell Amaral

31/07/2014

Outra coisa, retira o mapped by deixando assim:

@OneToMany( cascade = CascadeType.ALL)
private Set<ItemVenda> itens;


Caro Ronaldo,
Estou com uma dúvida sobre a utilização do cascade, no caso o CascadeType.ALL é recomendado? Pois o ItemVenda a ser inserido é uma tabela relacional entre venda e produto, certo? No caso com CascadeType.ALL não causaria uma persistência duplicada de produto e venda, pois ao inserir o itemVenda, o mesmo persistiria novamente os filhos item e venda , nao?
Se tiver algum material que me ajude a entender melhor a utilização do cascade, pois os exemplos que vejo somente tem a utilização do CascadeType.ALL.

PROBLEMA QUE TENHO{

1. Cadastrar um itemVenda, tenho mapeado produto, venda e item, onde a relação do item com venda e produto é ManyToOne. O Produto e venda tem um relacionamento OneToMany com ItemVenda;
2. Para inserir um ItemVenda novo, posso buscar o produto e a venda no bando de dados e inserir por meio do set produto e venda na classe Item venda e persistir o ItemVenda com o cascadeType.ALL? Pois o que acontece comigo é que o ItemVenda é persistido e a venda e o produto novamente.

}


No caso como faço para que possa somente relacionar venda e produto por meio da tabela ItemVenda sem que os mesmo sejam persistidos novamente?
Desde já grato,

Abraço.
GOSTEI 0
POSTAR