Olá Colegas
Estou criando uma classe de estoques onde a chave da tabela será o código do produto+local, isso para que o sistema possa controlar vários estoques do mesmo produto em locais diferentes.
Criei uma entidade chamada Estoques e outra chamada EstoquesPK ( Esta para armazenar a chave composta), porem ao executar esta retornando o erro abaixo.
The mapping [B2_COD] from the embedded ID class [class entidades.EstoquesPK] is an invalid mapping for this class. An embeddable class that is used with an embedded ID specification (attribute [id] from the source [class entidades.Estoques]) can only contain basic mappings. Either remove the non basic mapping or change the embedded ID specification on the source to be embedded.
Segue abaixo a chave composta
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
@Embeddable
public class EstoquesPK implements Serializable {
private static final long serialVersionUID = -637018809489152388L;
private Produtos B2_COD;
@Column(length = 2)
private String B2_LOCAL;
public Produtos getB2_COD() {
return B2_COD;
}
public void setB2_COD(Produtos b2_COD) {
B2_COD = b2_COD;
}
public String getB2_LOCAL() {
return B2_LOCAL;
}
public void setB2_LOCAL(String b2_LOCAL) {
B2_LOCAL = b2_LOCAL;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((B2_COD == null) ? 0 : B2_COD.hashCode());
result = prime * result + ((B2_LOCAL == null) ? 0 : B2_LOCAL.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;
EstoquesPK other = (EstoquesPK) obj;
if (B2_COD == null) {
if (other.B2_COD != null)
return false;
} else if (!B2_COD.equals(other.B2_COD))
return false;
if (B2_LOCAL == null) {
if (other.B2_LOCAL != null)
return false;
} else if (!B2_LOCAL.equals(other.B2_LOCAL))
return false;
return true;
}
}
Segue Entidade que usa a chave composta
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
@Entity
public class Estoques implements Serializable {
private static final long serialVersionUID = 5999236902534007386L;
@EmbeddedId
private EstoquesPK id;
private int B2_QATU;
private double B2_CMUNIT;
private double B2_VATU;
private double B2_QFIM;
private double B2_VFIM;
@Column(length = 10)
private String B2_DTFECHA;
@Column(length = 10)
private String B2_DTULTINV;
@Column(length = 10)
private String B2_DTCADASTRO;
@Column(length = 10)
private String B2_ALTERA;
@Column(length = 10)
private String B2_DTINTEG;
public EstoquesPK getId() {
return id;
}
public String getDescric() {
return id.getB2_COD().getB1_DESC();
}
public void setId(EstoquesPK id) {
this.id = id;
}
public int getB2_QATU() {
return B2_QATU;
}
public void setB2_QATU(int b2_QATU) {
B2_QATU = b2_QATU;
}
public double getB2_CMUNIT() {
return B2_CMUNIT;
}
public void setB2_CMUNIT(double b2_CMUNIT) {
B2_CMUNIT = b2_CMUNIT;
}
public double getB2_VATU() {
return B2_VATU;
}
public void setB2_VATU(double b2_VATU) {
B2_VATU = b2_VATU;
}
public double getB2_QFIM() {
return B2_QFIM;
}
public void setB2_QFIM(double b2_QFIM) {
B2_QFIM = b2_QFIM;
}
public double getB2_VFIM() {
return B2_VFIM;
}
public void setB2_VFIM(double b2_VFIM) {
B2_VFIM = b2_VFIM;
}
public String getB2_DTFECHA() {
return B2_DTFECHA;
}
public void setB2_DTFECHA(String b2_DTFECHA) {
B2_DTFECHA = b2_DTFECHA;
}
public String getB2_DTULTINV() {
return B2_DTULTINV;
}
public void setB2_DTULTINV(String b2_DTULTINV) {
B2_DTULTINV = b2_DTULTINV;
}
public String getB2_DTCADASTRO() {
return B2_DTCADASTRO;
}
public void setB2_DTCADASTRO(String b2_DTCADASTRO) {
B2_DTCADASTRO = b2_DTCADASTRO;
}
public String getB2_ALTERA() {
return B2_ALTERA;
}
public void setB2_ALTERA(String b2_ALTERA) {
B2_ALTERA = b2_ALTERA;
}
public String getB2_DTINTEG() {
return B2_DTINTEG;
}
public void setB2_DTINTEG(String b2_DTINTEG) {
B2_DTINTEG = b2_DTINTEG;
}
}
A única coisa que estou usando diferente é que na chave composta o campo B2_COD é um objeto da classe Produtos. Ja tentei fazer este mapeamento de varias maneiras e não obtive sucesso. Por favor se algum puder me ajudar Agradeço.
Abraço
No atributo B2_COD do EstoquesPK você tem que pôr @ManyToOne e o @JoinColumn com o nome da coluna.
Ola Ricardo
Muito Obrigado pela ajuda.
Procedi conforme abaixo na classe EstoquesPK, porem agora esta apresentando erro na classe Estoques (“embedded id class should not contain relationship mappings”). o Erro aparece na linha da anotação @EmbeddedId, porem não sei como solucionar.
Segue alterações que efetuei.
@Embeddable
public class EstoquesPK implements Serializable {
private static final long serialVersionUID = -637018809489152388L;
//@Column(length = 30)
@ManyToOne
@JoinColumn(name = "B2_COD", referencedColumnName = "B1_COD")
private Produtos B2_COD;
@Column(length = 2)
private String B2_LOCAL;
Obs:. B1_COD é o campo da classe Produtos
Ola Ricardo
Adicionei @Id abaixo do @EmbeddedId e corrigiu o erro.
Valeu pela ajuda. vou continuar os testes
Obrigado
1 curtida
@staroski
Procedendo conforme orientado após a alteração o eclipse esta retornando um erro na criação da tabela devido a chave criada na Classe Estoques com o campo “id”. No eclipse o erro apresentado é esse:
“A coluna ‘ID’ da tabela ‘SB2’ é do tipo inválido para uso como coluna de chaves em um índice.”
No erro esta sendo apresentada na criação da tabela conforme abaixo.
CREATE TABLE SB2 (
ID IMAGE NOT NULL
,B2_ALTERA VARCHAR(10) NULL
,B2_CMUNIT FLOAT(32) NULL
,B2_DTCADASTRO VARCHAR(10) NULL
,B2_DTFECHA VARCHAR(10) NULL
,B2_DTINTEG VARCHAR(10) NULL
,B2_DTULTINV VARCHAR(10) NULL
,B2_QATU INTEGER NULL
,B2_QFIM FLOAT(32) NULL
,B2_VATU FLOAT(32) NULL
,B2_VFIM FLOAT(32) NULL
,PRIMARY KEY (ID)
)
Realmente o SQL não consegue criar esta tabela neste formato devido ao campo image estar sendo utilizado com índice da tabela.
Não sei se consegue me ajudar, mas desde já agradeço.
Segue fontes alterados
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Embeddable
public class EstoquesPK implements Serializable {
private static final long serialVersionUID = -637018809489152388L;
@ManyToOne
@JoinColumn(name = "B2_COD", referencedColumnName = "B1_COD")
private Produtos B2_COD;
@Column(length = 2)
private String B2_LOCAL;
public Produtos getB2_COD() {
return B2_COD;
}
public void setB2_COD(Produtos b2_COD) {
B2_COD = b2_COD;
}
public String getB2_LOCAL() {
return B2_LOCAL;
}
public void setB2_LOCAL(String b2_LOCAL) {
B2_LOCAL = b2_LOCAL;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((B2_COD == null) ? 0 : B2_COD.hashCode());
result = prime * result + ((B2_LOCAL == null) ? 0 : B2_LOCAL.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;
EstoquesPK other = (EstoquesPK) obj;
if (B2_COD == null) {
if (other.B2_COD != null)
return false;
} else if (!B2_COD.equals(other.B2_COD))
return false;
if (B2_LOCAL == null) {
if (other.B2_LOCAL != null)
return false;
} else if (!B2_LOCAL.equals(other.B2_LOCAL))
return false;
return true;
}
}
Fonte da chave
package entidades;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "SB2")
public class Estoques implements Serializable {
private static final long serialVersionUID = 5999236902534007386L;
@EmbeddedId
@Id
private EstoquesPK id;
private int B2_QATU;
private double B2_CMUNIT;
private double B2_VATU;
private double B2_QFIM;
private double B2_VFIM;
@Column(length = 10)
private String B2_DTFECHA;
@Column(length = 10)
private String B2_DTULTINV;
@Column(length = 10)
private String B2_DTCADASTRO;
@Column(length = 10)
private String B2_ALTERA;
@Column(length = 10)
private String B2_DTINTEG;
public EstoquesPK getId() {
return id;
}
public String getDescric() {
return id.getB2_COD().getB1_DESC();
}
public void setId(EstoquesPK id) {
this.id = id;
}
public int getB2_QATU() {
return B2_QATU;
}
public void setB2_QATU(int b2_QATU) {
B2_QATU = b2_QATU;
}
public double getB2_CMUNIT() {
return B2_CMUNIT;
}
public void setB2_CMUNIT(double b2_CMUNIT) {
B2_CMUNIT = b2_CMUNIT;
}
public double getB2_VATU() {
return B2_VATU;
}
public void setB2_VATU(double b2_VATU) {
B2_VATU = b2_VATU;
}
public double getB2_QFIM() {
return B2_QFIM;
}
public void setB2_QFIM(double b2_QFIM) {
B2_QFIM = b2_QFIM;
}
public double getB2_VFIM() {
return B2_VFIM;
}
public void setB2_VFIM(double b2_VFIM) {
B2_VFIM = b2_VFIM;
}
public String getB2_DTFECHA() {
return B2_DTFECHA;
}
public void setB2_DTFECHA(String b2_DTFECHA) {
B2_DTFECHA = b2_DTFECHA;
}
public String getB2_DTULTINV() {
return B2_DTULTINV;
}
public void setB2_DTULTINV(String b2_DTULTINV) {
B2_DTULTINV = b2_DTULTINV;
}
public String getB2_DTCADASTRO() {
return B2_DTCADASTRO;
}
public void setB2_DTCADASTRO(String b2_DTCADASTRO) {
B2_DTCADASTRO = b2_DTCADASTRO;
}
public String getB2_ALTERA() {
return B2_ALTERA;
}
public void setB2_ALTERA(String b2_ALTERA) {
B2_ALTERA = b2_ALTERA;
}
public String getB2_DTINTEG() {
return B2_DTINTEG;
}
public void setB2_DTINTEG(String b2_DTINTEG) {
B2_DTINTEG = b2_DTINTEG;
}
}