Problema Composite-id com ManyToOne em Annotation

2 respostas
gulira

Galera estou quebrando a cabeça ao tentar trabalhar com composite-id e ManyToOne.

O problema é o seguinte, eu tenho uma Classe chamada REDUZIDO onde a chave composta na tabela (PROREDUZIDO) é composta por LJA_CODIGO+RED_CODIGO. Nesta mesma tabela PROREDUZIDO eu tenho um relacionamento com a tabela PROPRODUTO com as colunas (LJA_CODIGO+PRO_CODIGO “pois PRODUTO tambem tem chave composta”)

Quanto tento fazer

@ManyToOne
	@JoinColumns({
		@JoinColumn(name="LJA_CODIGO"),		
		@JoinColumn(name="PRO_CODIGO")
                 })

na classe PROREDUZIDO o hibernate me diz:
Exception in thread “main” org.hibernate.MappingException: Repeated column in mapping for entity: micromotion.servidor.modelo.Reduzido column: LJA_CODIGO (should be mapped with insert=“false” update=“false”)

deste modo nao consigo fazer o relacionamento entre classe ao qual exista chave composta em ambas.

Alguem ja passou por esta situação e pode me ajudar.
Dem uma olhada nas configurações do problema…

[size=18]ESTRUTURAS DA TABELAS[/size]

[b]LOJA[/b]
LJA_CODIGO(PK)
...

[b]PROPRODUTO[/b]
LJA_CODIGO(PK,FK)
PRO_CODIGO(PK)
...

[b]PROREDUZIDO[/b]
LJA_CODIGO(PK,FK)
RED_CODIGO(PK)
PRO_CODIGO(FK)
...

Loja.java

package micromotion.servidor.modelo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="FIALOJA")
public class Loja {
	private int codigo;
	private String descricao;
	
	@Id
	@Column(name="LJA_CODIGO")
	public int getCodigo() {
		return codigo;
	}
	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}
	
	@Column(name="LJA_DESCRI")
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
}

Produto.java

package micromotion.servidor.modelo;

import java.io.Serializable;
import java.util.Collection;

import javax.persistence.*;

import micromotion.servidor.util.Exportacao;

@Entity
@Table(name="PROPRODUTOS")
public class Produto implements Serializable{
	
	private ProdutoId id;
	
	private String mascara;
	private String descricao;
	private String descricaoReduzida;
	private Collection<Colecao> colecoes;

	@Id
	@EmbeddedId
	@AttributeOverrides ( {
			@AttributeOverride(name = "ljaCodigo", column = @Column(name = "LJA_CODIGO")),
			@AttributeOverride(name = "proCodigo", column = @Column(name = "PRO_CODIGO")) })	
	public ProdutoId getId() {
		return id;
	}
	public void setId(ProdutoId id) {
		this.id = id;
	}
	
	@Column(name="PRO_MASKCOD")
	public String getMascara() {
		return mascara;
	}
	public void setMascara(String mascara) {
		this.mascara = mascara;
	}	

	@Column(name="PRO_DESCRICAO")
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	
	@Column(name="PRO_DESCR_REDUZIDA")
	public String getDescricaoReduzida() {
		return descricaoReduzida;
	}
	
	public void setDescricaoReduzida(String descricaoReduzida) {
		this.descricaoReduzida = descricaoReduzida;
	}
	
	@ManyToMany(
			targetEntity=micromotion.servidor.modelo.Colecao.class,
			cascade={CascadeType.PERSIST, CascadeType.MERGE}
	)
	@JoinTable(			
			name="PROPRODUTOCOLECAO",			
			joinColumns={@JoinColumn(name="LJA_CODIGO"),@JoinColumn(name="PRO_CODIGO")},
			inverseJoinColumns={@JoinColumn(name="COL_CODIGO")}
	)
	public Collection<Colecao> getColecoes() {
		return colecoes;
	}
	public void setColecoes(Collection<Colecao> colecoes) {
		this.colecoes = colecoes;
	}	
}

ProdutoId.java

package micromotion.servidor.modelo;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Embeddable
public class ProdutoId implements Serializable{
	
	private Loja loja;
	private int proCodigo;

	@ManyToOne
	@JoinColumn(name="LJA_CODIGO")
	public Loja getLoja(){
		return this.loja;		
	}
	public void setLoja(Loja loja){
		this.loja = loja;
	}
	
	@Column(name = "PRO_CODIGO")
	public int getProCodigo() {
		return proCodigo;
	}
	public void setProCodigo(int proCodigo) {
		this.proCodigo = proCodigo;
	}	
	
}

Reduzido.java

package micromotion.servidor.modelo;

import java.io.Serializable;

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="PROREDUZIDOPRODUTO")
public class Reduzido implements Serializable{	
	
	private ReduzidoId id;
	private Padrao padrao;
	private Produto produto;
	
	@Id
	@EmbeddedId
	@AttributeOverrides ( {
			@AttributeOverride(name = "ljaCodigo", column = @Column(name = "LJA_CODIGO")),
			@AttributeOverride(name = "redCodigo", column = @Column(name = "RED_PRODUTO_KEY")) })		
	public ReduzidoId getId() {
		return id;
	}
	public void setId(ReduzidoId id) {
		this.id = id;
	}
	
	@ManyToOne(
			targetEntity=micromotion.servidor.modelo.Padrao.class, 
			cascade={CascadeType.PERSIST,CascadeType.MERGE}
	)
	@JoinColumn(name="PAD_CODIGO")
	public Padrao getPadrao() {
		return padrao;
	}
	public void setPadrao(Padrao padrao) {
		this.padrao = padrao;
	}

[size=18]AQUI ESTA O PROBLEMA[/size]

	
	@ManyToOne
	@JoinColumns({
		@JoinColumn(name="LJA_CODIGO", referencedColumnName="LJA_CODIGO"),		
		@JoinColumn(name="PRO_CODIGO", referencedColumnName="PRO_CODIGO")
	})	
	public Produto getProduto() {
		return produto;
	}
	public void setProduto(Produto produto) {
		this.produto = produto;
	}
}

ProdutoId.java

package micromotion.servidor.modelo;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Embeddable
public class ReduzidoId implements Serializable{
	private Loja loja;
	private int redCodigo;
	
	@ManyToOne
	@JoinColumn(name="LJA_CODIGO")
	public Loja getLoja(){
		return this.loja;
	}
	public void setLoja(Loja loja){
		this.loja = loja;
	}
	
	@Column(name = "RED_PRODUTO_KEY")	
	public int getRedCodigo() {
		return redCodigo;
	}
	public void setRedCodigo(int redCodigo) {
		this.redCodigo = redCodigo;
	}	
}

2 Respostas

gulira

Galera depois de conversar com um amigo meu, consegui resolver o problema.

so remover o composite da classe REDUZIDO --&gt(REDUZIDOID) e deixar a classe PRODUTO gerenciar já que ela vai ser um atributo da classe e um relacionamento do banco(FKs)

V

eu passei por isso e acredito q seja algo assim

como tem o mesmo campo em um relacionamento da classe e outro do id, ele tenta persistir os dois
em um deles vc tem q colocar insertable=false e updatable=false
acho q teria q colocar no relacionamento da classe e deixar ele persistir no id

Criado 12 de novembro de 2006
Ultima resposta 31 de jan. de 2007
Respostas 2
Participantes 2