Chave primaria composta converter

Bom dia galera do GUJ;

Como implemento um Converter quando minha model tem chave composta?
Obrigado.

abaixo minha classe chave composta

@Embeddable
public class CompraPk implements Serializable {

	private static final long serialVersionUID = 1L;
	
	private Integer numeronota;
	private Long codigofornecedor;
	private Integer serie;

	public CompraPk() {

	}

	public CompraPk(Integer numeronota, Long codigofornecedor, Integer serie) {
		this.numeronota = numeronota;
		this.codigofornecedor = codigofornecedor;
		this.serie = serie;
	}

	public Integer getNumeronota() {
		return numeronota;
	}

	public void setNumeronota(Integer numeronota) {
		this.numeronota = numeronota;
	}

	public Long getCodigofornecedor() {
		return codigofornecedor;
	}

	public void setCodigofornecedor(Long codigofornecedor) {
		this.codigofornecedor = codigofornecedor;
	}

	public Integer getSerie() {
		return serie;
	}

	public void setSerie(Integer serie) {
		this.serie = serie;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((codigofornecedor == null) ? 0 : codigofornecedor.hashCode());
		result = prime * result + ((numeronota == null) ? 0 : numeronota.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		CompraPk other = (CompraPk) obj;
		if (codigofornecedor == null) {
			if (other.codigofornecedor != null)
				return false;
		} else if (!codigofornecedor.equals(other.codigofornecedor))
			return false;
		if (numeronota == null) {
			if (other.numeronota != null)
				return false;
		} else if (!numeronota.equals(other.numeronota))
			return false;
		return true;
	}

e esta classe de perisntencia

package br.com.sysgestao.modelo;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.FetchType;

import javax.persistence.JoinColumn;

import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;



@Entity
public class Compra implements Serializable {
	private static final long serialVersionUID = 1L;
	
	@EmbeddedId
	private CompraPk comprapk;
	
	@ManyToOne
	@JoinColumn(nullable = false)
	private Fornecedor fornecedor;
	
	@Temporal(TemporalType.DATE)
	private Date dataCompra;
	
	@Temporal(TemporalType.DATE)
	private Date datadeentrada;
	
	@Column(nullable = false, precision = 10, scale = 2)
	private BigDecimal totalnota;
	
	@Column(precision = 10, scale = 2)
	private BigDecimal outradespeszas;
	
	@Column(precision = 10, scale = 2)
	private BigDecimal seguro;
	
	@Column(precision = 10, scale = 2)
	private BigDecimal valordofrete;
	
	private BigDecimal totalproduto;
	private BigDecimal desconto;
	
	@Transient
	private Float markqup;
	
	@Fetch(FetchMode.SUBSELECT)
	@OneToMany(mappedBy = "compra", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
	private List<ItensCompras> itemc = new ArrayList<>();
	
	@OneToMany(mappedBy = "compra", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
	private List<ContaaPagar> colecaoconta = new ArrayList<>();

	public Compra() {
		this.valordofrete = BigDecimal.ZERO;
		this.outradespeszas = BigDecimal.ZERO;
		this.seguro = BigDecimal.ZERO;
	}

	public Fornecedor getFornecedor() {
		if (fornecedor == null) {
			fornecedor = new Fornecedor();
		}
		return fornecedor;
	}

	public void setFornecedor(Fornecedor fornecedor) {
		this.fornecedor = fornecedor;
	}

	public BigDecimal getTotalnota() {
		return totalnota;
	}

	public void setTotalnota(BigDecimal totalnota) {
		this.totalnota = totalnota;
	}

	public BigDecimal getOutradespeszas() {
		return outradespeszas;
	}

	public void setOutradespeszas(BigDecimal outradespeszas) {
		this.outradespeszas = outradespeszas;
	}

	public BigDecimal getSeguro() {
		return seguro;
	}

	public void setSeguro(BigDecimal seguro) {
		this.seguro = seguro;
	}

	public BigDecimal getValordofrete() {
		return valordofrete;
	}

	public void setValordofrete(BigDecimal valordofrete) {
		this.valordofrete = valordofrete;
	}

	public List<ItensCompras> getItemc() {
		return itemc;
	}

	public void setItemc(List<ItensCompras> itemc) {
		this.itemc = itemc;
	}

	public CompraPk getComprapk() {
		return comprapk;
	}

	public void setComprapk(CompraPk comprapk) {
		this.comprapk = comprapk;
	}

	public List<ContaaPagar> getColecaoconta() {
		return colecaoconta;
	}

	public void setColecaoconta(List<ContaaPagar> colecaoconta) {
		this.colecaoconta = colecaoconta;
	}

	public Date getDataCompra() {
		return dataCompra;
	}

	public void setDataCompra(Date dataCompra) {
		this.dataCompra = dataCompra;
	}

	public Date getDatadeentrada() {
		return datadeentrada;
	}

	public void setDatadeentrada(Date datadeentrada) {
		this.datadeentrada = datadeentrada;
	}

	public BigDecimal getTotalproduto() {
		return totalproduto;
	}

	public void setTotalproduto(BigDecimal totalproduto) {
		this.totalproduto = totalproduto;
	}

	public BigDecimal getDesconto() {
		return desconto;
	}

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

	public Float getMarkqup() {
		return markqup;
	}

	public void setMarkqup(Float markqup) {
		this.markqup = markqup;
	}

	public List<ContaaPagar> addparcela() {
		Integer numparcela = 0;
		
		for (int pos = 0; pos < fornecedor.getCondicaoPagamento().getColecaoparcelas().size(); pos++) {
			numparcela = numparcela + 1;
			BigDecimal valorparcela = new BigDecimal(0.00d);
			BigDecimal percentual = new BigDecimal(0.00d);
			
			ContaaPagar contaaPagar = new ContaaPagar();
			percentual = fornecedor.getCondicaoPagamento().getColecaoparcelas().get(pos).getPercentual();
			percentual = percentual.divide(new BigDecimal(100d));
			
			ContaaPk contapk = new ContaaPk();
			contapk.setCodigofornecedor(fornecedor.getCodigo());
			contapk.setNumparcela(numparcela);
			contapk.setNumtitulo(comprapk.getNumeronota());
			
			contaaPagar.setContaaPk(contapk);
			contaaPagar.setCompra(this);
			contaaPagar.setFormadepagamento(fornecedor.getCondicaoPagamento().getColecaoparcelas().get(pos).getFormadePagamento());
			contaaPagar.setCondicaoPagamento(fornecedor.getCondicaoPagamento());
			contaaPagar.setFornecedor(fornecedor);
			contaaPagar.setNumerodaparcela(numparcela);
			contaaPagar.setStatusconta(StatusConta.Aberto);
			
			Calendar c = Calendar.getInstance();
			Date data = dataCompra;
			c.setTime(data);
			c.add(Calendar.DATE, fornecedor.getCondicaoPagamento().getColecaoparcelas().get(pos).getDia());
			data = c.getTime();
			contaaPagar.setDatavencimento(data);
			valorparcela = totalnota.multiply(percentual);
			contaaPagar.setValoparcela(valorparcela);
			contaaPagar.setValorapagar(valorparcela);
			colecaoconta.add(contaaPagar);
		}
		
		return colecaoconta;
	}

    public List<ItensCompras> remove(ItensCompras item) {
    	int achou = -1;
    
		for (int posicao = 0; posicao < itemc.size()&& achou<0 ; posicao++) {
			ItensCompras itemtemp= itemc.get(posicao);
			
			if (itemtemp.getProduto().equals(item.getProduto())) {
				System.out.println(item.getProduto().getNomeproduto());
				System.out.println(itemtemp.getProduto().getNomeproduto());
				achou=posicao;		
			}
		}

		if (achou > -1) {
			totalproduto = totalproduto.subtract(itemc.get(achou).getSubtotal());
			totalnota =totalnota.subtract(itemc.get(achou).getSubtotal());
			itemc.remove(achou);
		}
		
		return itemc;
    }
	
    public void remvoveconta() {
		colecaoconta.clear();
	}

//	@Override
//	public String toString() {
//		return "Compra [comprapk=" + comprapk + "]";
//	}
	
	@Override
	public String toString() {
		return String.format("%s[comprapk=%d]", getClass().getSimpleName(),getComprapk());
	}
}

método de busca por id

public Compra buscarchave (CompraPk comprapk) {
	return em.find(Compra.class, comprapk);
}

O tostring tanto faz um ou outro todos ocorre mesmo erro .