@ManyToMany unidirecional

2 respostas
programaçãojava
joaopaulonunesm

Olá Galera, estou com dificuldade em relacionar Produto e Venda. Pretendo relacionar @ManyToMany unidirecional. Onde uma venda pode possuir muitos produtos e muitos produtos podem estar em uma só venda. Porem Produto não precisa saber em qual venda ele esta.
Até agora tenho as classes Venda e Produto dessa forma:

@Entity
public class Produto {

	@Id
	@SequenceGenerator(name = "PRODUTO_SEQ", sequenceName = "PRODUTOSEQ", initialValue = 1, allocationSize = 1)
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "PRODUTO_SEQ")
	public int id;
	@Column(nullable = false)
	public String titulo;
	@Column(nullable = false)
	public String sku;
	@Column(nullable = false)
	public double preco;
	@Column(nullable = false)
	public int estoque;
	public String descricao;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public String getSku() {
		return sku;
	}

	public void setSku(String sku) {
		this.sku = sku;
	}

	public double getPreco() {
		return preco;
	}

	public void setPreco(double preco) {
		this.preco = preco;
	}

	public int getEstoque() {
		return estoque;
	}

	public void setEstoque(int estoque) {
		this.estoque = estoque;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

}

E minha classe Venda dessa maneira:

@Entity
public class Venda {

	@Id
	@SequenceGenerator(name = "VENDA_SEQ", sequenceName = "VENDASEQ", initialValue = 1, allocationSize = 1)
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "VENDA_SEQ")
	public int id;
	@ManyToMany(mappedBy = "Produto", targetEntity = Produto.class)
	@JoinTable(name = "produtos_da_venda", joinColumns = { @JoinColumn(name = "id_produto") }, inverseJoinColumns = {
			@JoinColumn(name = "id_venda") })
	public List<Produto> produto;
	@OneToOne
	@JoinColumn(name = "id_cliente", nullable = false)
	public Cliente cliente;
	public double desconto;
	public double acrescimo;
	@Column(nullable = false)
	public double total;
	@Column(name = "data", nullable = false)
	@Temporal(TemporalType.TIMESTAMP)
	public Date data;
	public String status;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public List<Produto> getProduto() {
		return produto;
	}

	public void setProduto(List<Produto> produto) {
		this.produto = produto;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public double getDesconto() {
		return desconto;
	}

	public void setDesconto(double desconto) {
		this.desconto = desconto;
	}

	public double getAcrescimo() {
		return acrescimo;
	}

	public void setAcrescimo(double acrescimo) {
		this.acrescimo = acrescimo;
	}

	public double getTotal() {
		return total;
	}

	public void setTotal(double total) {
		this.total = total;
	}

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

}

Alguem poderia me auxiliar por gentileza?
O Erro é: mappedBy reference an unknown target entity property: br.com.cadastrocliente.entidade.Produto.produto in br.com.cadastrocliente.entidade.Venda.produto

2 Respostas

F

Olá, no meu ponto de vista, em primeiro lugar, a organização das tabelas está incorreta.

Veja bem, deveriam existir 3 classes (tabelas) envolvidas.

Produto, Venda e ProdutoVenda.

Logo, o relacionamento entre Produto e Venda, se dá em ProdutoVenda.

Esta classe sim, faz referência tanto à Produto, quanto à Venda.

public class ProdutoVenda {

    @ManyToOne
    private Produto produto;
    @ManyToOne
    private Venda venda;
    // quantidade, valor, etc... são variáveis que tbm devem estar por aqui

}

Você pode (opcionalmente) mapear os ProdutoVenda aqui:

public class Venda {

    @OneToMany(targetEntity = ProdutoVenda.class, fetch = FetchType.LAZY, mappedBy = "venda",
    cascade = CascadeType.ALL, orphanRemoval = true)
    private List<ProdutoVenda> produtosVenda;

}
pmlm

São necessárias 3 tabelas na BD, mas podem ser apenas 2 classes no código.

Em relação ao erro, a tua relação não está mapeada na classe Produto pelo que deves mudar

@ManyToMany(mappedBy = "Produto", targetEntity = Produto.class)

para

@ManyToMany
Criado 31 de dezembro de 2016
Ultima resposta 31 de dez. de 2016
Respostas 2
Participantes 3