[RESOLVIDO] Mapeamento Entidade

10 respostas
I

Bom dia senhores, estou com um pequeno problema de mapeamento de relacionamentos.

Vamos ao minha realidade:

Tenho uma entidade Empresa, aonde a mesma possui relacionamento com outras três Entidades (Tabelas no banco) "Bairro, Município e Estado".
Levando em consideração que uma empresa poderá pertencer apenas a um estado, um município e um bairro. porém eles poderão conter diversas empresas.

Criei a minha entidade, e fiz o mapeamento.. Assim como também fiz o mapeamento das Entidades Bairro, Município e Unidade Federação, aonde elas também tem relacionamento de chave estrangeiras.

Ao executar minha aplicação, ocorre o seguinte erro:

org.hibernate.AnnotationException: @OneToOne or @ManyToOne on br.com.projeto.modelo.entidade.Empresa.UF references an unknown entity: br.com.projeto.modelo.entidade.UnidadeFederacao
	org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:103)
	org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:541)
	org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:523)
	org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:380)
	org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1377)
	org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
	br.com.projeto.util.HibernateUtil.<clinit>(HibernateUtil.java:17)
	br.com.projeto.controller.ListenerFasesJSF.beforePhase(ListenerFasesJSF.java:25)
	com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:228)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:99)
	com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)

Realmente não sei o que pode estar acontecendo.

Segue minha entidade

package br.com.projeto.modelo.entidade;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "cor_empresa")
public class Empresa implements Serializable {

	private static final long serialVersionUID = 5695971669305794838L;

	@Id
	@GeneratedValue
	@Column(name = "EMP_CD_EMP")
	private Integer cdEmp;

	@Column(name = "EMP_NR_CNPJ")
	private String nrCnpj;

	@Column(name = "EMP_NM_EMP")
	private String nmEmp;

	@Column(name = "EMP_NM_FANT")
	private String nmFant;

	@Column(name = "EMP_DS_LOGR")
	private String dsLogr;

	@Column(name = "EMP_NR_LOG")
	private String nrLog;

	@Column(name = "EMP_CD_CEP")
	private String cdCep;
	
	@ManyToOne
	@JoinColumn(name="EMP_CD_UF")
	private UnidadeFederacao UF;
	
	@ManyToOne
	@JoinColumn(name="EMP_CD_MUNI")
	private Municipio municipio;

	@Column(name = "EMP_CD_USR_INS")
	private Integer cdUsrIns;

	@Column(name = "EMP_DT_INS_REG")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dtInsReg;

	@Column(name = "EMP_CD_USR_ATU")
	private Integer cdUsrAut;

	@Column(name = "EMP_DT_ULT_ATU")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dtUltAtu;


}

Se alguém puder ajudar, agradeço desde já..

10 Respostas

W

Está dizendo que a entidade UnidadeFederacao é desconhecida. Você declarou ela no hibernate.cfg.xml? Anotou ela com @Entity?

I

Wagner, realmente eu não havia mapeado ela no hibernate.cfg.xml,

Sempre esqueço de fazer essas coisas…

Obrigado!

I

Agora ocorreu outro erro:

org.hibernate.AnnotationException: A Foreign key refering br.com.projeto.modelo.entidade.Municipio from br.com.projeto.modelo.entidade.Empresa has the wrong number of column. should be 2 org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:421) org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:111) org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:541) org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:523) org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:380) org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1377) org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954) br.com.projeto.util.HibernateUtil.<clinit>(HibernateUtil.java:17) br.com.projeto.controller.ListenerFasesJSF.beforePhase(ListenerFasesJSF.java:25) com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:228) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:99) com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116) com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)

Ta dificil, mas explanando rapidamente, pois isso deve estar ocorrendo, referente a minha classe municipio conter uma chave primária composta. :frowning:

W

Você pode referenciar as duas colunas. Algo assim:

@ManyToOne
@JoinColumns({
   @JoinColumn(name="EMP_CD_MUNI", referencedColumnName = "EMP_CD_MUNI"),
   @JoinColumn(name="OUTRA_COLUNA", referencedColumnName = "OUTRA_COLUNA")
})
private Municipio municipio;
I

wagnerfrancisco:
Você pode referenciar as duas colunas. Algo assim:

@ManyToOne @JoinColumns({ @JoinColumn(name="EMP_CD_MUNI", referencedColumnName = "EMP_CD_MUNI"), @JoinColumn(name="OUTRA_COLUNA", referencedColumnName = "OUTRA_COLUNA") }) private Municipio municipio;

Hum… bem analisando aqui eu tenho

[b] @ManyToOne
	@JoinColumn(name="EMP_CD_UF")
	private UnidadeFederacao UF;[/b]
	
	@ManyToOne  
	@JoinColumns({  
	   @JoinColumn(name="EMP_CD_MUNI", referencedColumnName = "MUN_CD_MUNI"),  
	   @JoinColumn(name="EMP_CD_UF", referencedColumnName = "MUN_CD_UF")  
	})
	private Municipio municipio;

isso não estaria causando redundância ? pode acarretar algum erro?

vou testar aqui…

W

Qdo você referencia duas colunas na mesma entidade, uma deve ser insertable = false e updatable = false. Se não o hibernate não saberia como agir num update.

@ManyToOne
@JoinColumns({
   @JoinColumn(name="EMP_CD_MUNI", referencedColumnName = "EMP_CD_MUNI", insertable=  false, updatable = false),
   @JoinColumn(name="OUTRA_COLUNA", referencedColumnName = "OUTRA_COLUNA", insertable=  false, updatable = false)
})
private Municipio municipio;

Se você está criando a base de dados do zero, siga a dica do próprio hibernate e use chaves artificiais. Vai evitar este tipo de situação. Se for base legada, aí não tem jeito mesmo.

I

Pois é como imaginei…

org.hibernate.MappingException: Repeated column in mapping for entity: br.com.projeto.modelo.entidade.Empresa column: EMP_CD_UF (should be mapped with insert="false" update="false") org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:676) org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:698) org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:720) org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:474) org.hibernate.mapping.RootClass.validate(RootClass.java:236) org.hibernate.cfg.Configuration.validate(Configuration.java:1193) org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1378) org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954) br.com.projeto.util.HibernateUtil.<clinit>(HibernateUtil.java:17) br.com.projeto.controller.ListenerFasesJSF.beforePhase(ListenerFasesJSF.java:25) com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:228) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:99) com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116) com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)

Acredito que seja por causa de ter o mapeamento da entidade

@ManyToOne
	@JoinColumn(name="EMP_CD_UF", referencedColumnName="UFD_CD_UF")
	private UnidadeFederacao UF;

Mas vou tirar ela, assumindo que o campo EMP_CD_UF vai assumir o valor da chave primária referenciada no @JoinColumns ? correto?

W

Veja meu post anterior. :smiley:

I

:oops: :oops: :oops: hahahaha

so sorry!

I

wagnerfrancisco:
Qdo você referencia duas colunas na mesma entidade, uma deve ser insertable = false e updatable = false. Se não o hibernate não saberia como agir num update.

@ManyToOne
@JoinColumns({
   @JoinColumn(name="EMP_CD_MUNI", referencedColumnName = "EMP_CD_MUNI", insertable=  false, updatable = false),
   @JoinColumn(name="OUTRA_COLUNA", referencedColumnName = "OUTRA_COLUNA", insertable=  false, updatable = false)
})
private Municipio municipio;

Se você está criando a base de dados do zero, siga a dica do próprio hibernate e use chaves artificiais. Vai evitar este tipo de situação. Se for base legada, aí não tem jeito mesmo.

Obrigado Wagner, consegui resolver o problema com a dica que você me deu…

O problema de trabalhar com sistemas legados é esse :frowning:

Abraços!

Criado 25 de agosto de 2012
Ultima resposta 25 de ago. de 2012
Respostas 10
Participantes 2