Olá pessoal,
Sou iniciante em JPA e estou precisando de uma ajuda para configurar o mapeamento que está levantando esta exceção: org.hibernate.AnnotationException: A Foreign key refering br.com.majorEnterpriseJourney.model.Cidade from br.com.majorEnterpriseJourney.model.Acomodacao has the wrong number of column. should be 2
As 3 classes (Acomodação, Cidade e Estado) estão relacionadas da seguinte maneira:
Acomodação está em uma cidade e em um estado.
Uma cidade pode haver muitas acomodações.
Um estado pode haver muitas acomodações.
E o clássico relacionamento entre cidade e estado:
Uma cidade está localizada em um único estado e um estado possui diversas cidades.
O modelo no banco está da seguinte forma:
create table ESTADO (
ID_ESTADO INTEGER NOT NULL,
DESCRICAO VARCHAR(100) NOT NULL,
);
alter table ESTADO add constraint PK_ESTADO primary key(ID_ESTADO);
create table CIDADE (
ID_CIDADE INTEGER NOT NULL,
DESCRICAO VARCHAR(100) NOT NULL,
ID_ESTADO INTEGER NOT NULL
);
alter table CIDADE add constraint PK_CIDADE primary key(ID_CIDADE);
alter table CIDADE add constraint FK_ESTADO_CIDADE foreign key(ID_ESTADO) references ESTADO(ID_ESTADO);
create table ACOMODACAO (
ID_ACOMODACAO INTEGER NOT NULL,
ID_CIDADE INTEGER NOT NULL,
ID_ESTADO INTEGER NOT NULL
);
alter table ACOMODACAO add constraint PK_ACOMODACAO primary key(ID_ACOMODACAO);
alter table ACOMODACAO add constraint FK_CIDADE_ACOMODACAO foreign key(ID_CIDADE) references CIDADE(ID_CIDADE);
alter table ACOMODACAO add constraint FK_ESTADO_ACOMODACAO foreign key(ID_ESTADO) references ESTADO(ID_ESTADO);
As classes estão da seguinte forma:
@Entity
@Table(name="ESTADO")
@NamedQuery(name="Estado.findAll", query="SELECT e FROM Estado e")
public class Estado extends GenericModel implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID_ESTADO")
private Long idEstado;
@Column(name="DESCRICAO")
private String descricao;
//bi-directional many-to-one association to Acomodacao
@OneToMany(mappedBy="estado")
private List<Acomodacao> acomodacoes;
public Estado() {
}
public Long getIdEstado() {
return this.idEstado;
}
public void setIdEstado(Long idEstado) {
this.idEstado = idEstado;
}
public String getDescricao() {
return this.descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public List<Acomodacao> getAcomodacoes() {
return this.acomodacoes;
}
public void setAcomodacoes(List<Acomodacao> acomodacoes) {
this.acomodacoes = acomodacoes;
}
public Acomodacao addAcomodacao(Acomodacao acomodacao) {
getAcomodacoes().add(acomodacao);
acomodacao.setEstado(this);
return acomodacao;
}
public Acomodacao removeAcomodacao(Acomodacao acomodacao) {
getAcomodacoes().remove(acomodacao);
acomodacao.setEstado(null);
return acomodacao;
}
}
@Entity
@Table(name="CIDADE")
@NamedQuery(name="Cidade.findAll", query="SELECT e FROM Cidade e")
public class Cidade extends GenericModel implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID_CIDADE")
private Long idCidade;
@Column(name="ID_ESTADO")
private Long idEstado;
@Column(name="DESCRICAO")
private String descricao;
//bi-directional many-to-one association to Acomodacao
@OneToMany(mappedBy="cidade")
private List<Acomodacao> acomodacoes;
public Cidade() {
}
public Long getIdCidade() {
return this.idCidade;
}
public void setIdCidade(Long idCidade) {
this.idCidade = idCidade;
}
public String getDescricao() {
return this.descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public List<Acomodacao> getAcomodacoes() {
return this.acomodacoes;
}
public void setAcomodacoes(List<Acomodacao> acomodacoes) {
this.acomodacoes = acomodacoes;
}
public Acomodacao addAcomodacao(Acomodacao acomodacao) {
getAcomodacoes().add(acomodacao);
acomodacao.setCidade(this);
return acomodacao;
}
public Acomodacao removeAcomodacao(Acomodacao acomodacao) {
getAcomodacoes().remove(acomodacao);
acomodacao.setCidade(null);
return acomodacao;
}
public Long getIdEstado() {
return idEstado;
}
public void setIdEstado(Long idEstado) {
this.idEstado = idEstado;
}
}
@Entity
@Table(name="ACOMODACAO")
@NamedQuery(name="Acomodacao.findAll", query="SELECT a FROM Acomodacao a")
public class Acomodacao extends GenericModel implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID_ACOMODACAO")
private Long idAcomodacao;
//bi-directional many-to-one association to Cidade
@ManyToOne(fetch=FetchType.LAZY)
//@JoinColumn(name="ID_CIDADE", insertable=false, updatable=false)
//@JoinColumn(name="ID_CIDADE", referencedColumnName = "ID_CIDADE")
@JoinColumn(name="ID_CIDADE")
private Cidade cidade;
//bi-directional many-to-one association to Estado
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ID_ESTADO")
private Estado estado;
public Acomodacao() {
}
public Long getIdAcomodacao() {
return this.idAcomodacao;
}
public void setIdAcomodacao(Long idAcomodacao) {
this.idAcomodacao = idAcomodacao;
}
public Cidade getCidade() {
return this.cidade;
}
public void setCidade(Cidade cidade) {
this.cidade = cidade;
}
public Estado getEstado() {
return this.estado;
}
public void setEstado(Estado estado) {
this.estado = estado;
}
}
Tentei usar as anotações insertable=false, updatable=false e referencedColumnName no mapeamento @ManyToOne de Acomodação com Cidade mas
não resolveu, permanecendo com o mesmo erro.
Qualquer ajuda será válida.
Agraceço a colaboração.