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;
}
}