JPA com chave composta

5 respostas
edvaldo.santiago

Fala galera do Guj… blz!!!
Então pessoal estou com um problema quando vou usar uma chave composta no JPA que gera o seguinte erro:

Alguém já passou por isso
Valeu pessoal.

5 Respostas

_Renatu

Que eu saiba para criar uma chave composta você precisa de um novo objeto representando essa chave, você tá fazendo isso?

edvaldo.santiago

Sim
Aqui vai o código:

package com.br.exemploentity;

import java.io.Serializable;
import java.math.BigDecimal;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class Itemnotafiscal implements Serializable {
	@EmbeddedId
	private ItemnotafiscalPK pk;

	private String descricao;

	private BigDecimal vlrunitario;

	private BigDecimal vlrtotal;

	private int quantidade;

	private BigDecimal vlrdesconto;

	@ManyToOne
	@JoinColumn(name="idnotafiscal")
	private Notafiscal idnotafiscal;

	private static final long serialVersionUID = 1L;

	public Itemnotafiscal() {
		super();
	}

	public ItemnotafiscalPK getPk() {
		return this.pk;
	}

	public void setPk(ItemnotafiscalPK pk) {
		this.pk = pk;
	}

	public String getDescricao() {
		return this.descricao;
	}

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

	public BigDecimal getVlrunitario() {
		return this.vlrunitario;
	}

	public void setVlrunitario(BigDecimal vlrunitario) {
		this.vlrunitario = vlrunitario;
	}

	public BigDecimal getVlrtotal() {
		return this.vlrtotal;
	}

	public void setVlrtotal(BigDecimal vlrtotal) {
		this.vlrtotal = vlrtotal;
	}

	public int getQuantidade() {
		return this.quantidade;
	}

	public void setQuantidade(int quantidade) {
		this.quantidade = quantidade;
	}

	public BigDecimal getVlrdesconto() {
		return this.vlrdesconto;
	}

	public void setVlrdesconto(BigDecimal vlrdesconto) {
		this.vlrdesconto = vlrdesconto;
	}

	public Notafiscal getIdnotafiscal() {
		return this.idnotafiscal;
	}

	public void setIdnotafiscal(Notafiscal idnotafiscal) {
		this.idnotafiscal = idnotafiscal;
	}

}
package com.br.exemploentity;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class ItemnotafiscalPK implements Serializable {
	@Column(name="idnotafiscal", insertable=false, updatable=false)
	private int idnotafiscal2;

	private int iditemnotafiscal;

	private static final long serialVersionUID = 1L;

	public ItemnotafiscalPK() {
		super();
	}

	public int getIdnotafiscal2() {
		return this.idnotafiscal2;
	}

	public void setIdnotafiscal2(int idnotafiscal2) {
		this.idnotafiscal2 = idnotafiscal2;
	}

	public int getIditemnotafiscal() {
		return this.iditemnotafiscal;
	}

	public void setIditemnotafiscal(int iditemnotafiscal) {
		this.iditemnotafiscal = iditemnotafiscal;
	}

	@Override
	public boolean equals(Object o) {
		if (o == this) {
			return true;
		}
		if ( ! (o instanceof ItemnotafiscalPK)) {
			return false;
		}
		ItemnotafiscalPK other = (ItemnotafiscalPK) o;
		return (this.iditemnotafiscal == other.iditemnotafiscal)
			&& (this.idnotafiscal2 == other.idnotafiscal2);
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int hash = 17;
		hash = hash * prime + this.iditemnotafiscal;
		hash = hash * prime + this.idnotafiscal2;
		return hash;
	}

}

O que será que está faltando!?!?
Valeu pessoal

faelcavalcanti

não seria este id notafiscal 2.

você também poderia embutir na classe no relacionamento utilizando @Column, apesar de não ser uma boa prática.

edvaldo.santiago

Então…
Já alterei… e tb fiz o Eclipse gerar as classes e mesmo assim não funcionou…

faelcavalcanti

você fez o que ele pediu

a sua chave primária não poderá ser modificada, ou ela será criada ou removida. siga a recomendação do erro. acredito que funcione!

Criado 14 de julho de 2008
Ultima resposta 16 de jul. de 2008
Respostas 5
Participantes 3