[RESOLVIDO]Erro references an unknown entity

11 respostas
A
Ola pessoal, estou começando a trabalhar com java agora e estou com dificuldade na utilização do hibernate quando tenho que fazer relacionamento de tabelas. O que acontece é o seguinte.. tenho uma tabela com o nome setor.
CREATE TABLE `setor` (
  `id` tinyint(4) NOT NULL AUTO_INCREMENT,
  `setor` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
e uma tabela com o nome usuario que é relacionada com setor, portando um setor pode ter vários usuários mas um usuário só pode ser de um setor.
CREATE TABLE `usuario` (
  `id` tinyint(4) NOT NULL AUTO_INCREMENT,
  `nome` varchar(20) DEFAULT NULL,
  `idsetor` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `ID1` (`idsetor`),
  CONSTRAINT `FK_usuario` FOREIGN KEY (`idsetor`) REFERENCES `setor` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
E através do hibernate tools eu fiz a engenharia reversa e me gerou as seguintes classes: Class Setor
package teste;

// Generated 06/10/2011 17:33:07 by Hibernate Tools 3.4.0.CR1

import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * Setor generated by hbm2java
 */
@Entity
@Table(name = "setor", catalog = "test")
public class Setor implements java.io.Serializable {

	private Byte id;
	private String setor;
	private Set<Usuario> usuarios = new HashSet<Usuario>(0);

	public Setor() {
	}

	public Setor(String setor, Set<Usuario> usuarios) {
		this.setor = setor;
		this.usuarios = usuarios;
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "id", unique = true, nullable = false)
	public Byte getId() {
		return this.id;
	}

	public void setId(Byte id) {
		this.id = id;
	}

	@Column(name = "setor", length = 20)
	public String getSetor() {
		return this.setor;
	}

	public void setSetor(String setor) {
		this.setor = setor;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "setor")
	public Set<Usuario> getUsuarios() {
		return this.usuarios;
	}

	public void setUsuarios(Set<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

}
Class Usuario
package teste;

// Generated 06/10/2011 17:33:07 by Hibernate Tools 3.4.0.CR1

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

/**
 * Usuario generated by hbm2java
 */
@Entity
@Table(name = "usuario", catalog = "test")
public class Usuario implements java.io.Serializable {

	private Byte id;
	private Setor setor;
	private String nome;

	public Usuario() {
	}

	public Usuario(Setor setor, String nome) {
		this.setor = setor;
		this.nome = nome;
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "id", unique = true, nullable = false)
	public Byte getId() {
		return this.id;
	}

	public void setId(Byte id) {
		this.id = id;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "idsetor")
	public Setor getSetor() {
		return this.setor;
	}

	public void setSetor(Setor setor) {
		this.setor = setor;
	}

	@Column(name = "nome", length = 20)
	public String getNome() {
		return this.nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

}
Mas o problema é na hora de gravar no banco, ai da o seguinte erro:
Exception in thread "main" org.hibernate.AnnotationException: @OneToOne or @ManyToOne on teste.Usuario.setor references an unknown entity: teste.Setor
	at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:81)
	at org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:456)
	at org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:438)
	at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:309)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1333)
	at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
	at DAO.UsuarioDAO.addusuario(UsuarioDAO.java:16)
	at main.executar.main(executar.java:26)

Estou com um projeto aqui na empresa pra começar daqui a 2 semanas e vou precisar de um relacionamento parecido com esse, e to desesperado não sei mais o que fazer.
Eu já estou a uma semana procurando uma solução e não encontro, por favor se algum puder me ajudar, eu agradeço.

11 Respostas

M

Cara não entendi sua duvida… tem como reescrever ?

A

marcelogomesrp:
Cara não entendi sua duvida… tem como reescrever ?


Opa, desculpa Marcelo… é que enquanto eu postava, fui clicar em visualizar e acabei clicando em enviar ai o post ficou incompleto.
Mas agora já corrigi.

Muito Obrigado.

M

Você poderia postar seu arquivo de configuração do Hibernate/JPA?
Provavelmente a classe teste.Setor não está relacionada como uma entity. Se estiver usando um arquivo de configurações persistence.xml (JPA), vc deve relacionar todas as entidades nele, pois pela especificação não é garantido que as implementações façam um scan procurando as classes anotadas com @Entity em aplicações não Java EE.

A
marcelocenerine:
Você poderia postar seu arquivo de configuração do Hibernate/JPA?
Marcelo, o único arquivo xml que tenho é esse: hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
        <property name="hibernate.connection.password">*******</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost/test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.default_schema">test</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        
        
        <mapping class="teste.Usuario"/>
        <mapping class="teste.Setor"/> 
        
    </session-factory>
</hibernate-configuration>

Obrigado

M

Seguinte,

Olhando na sua entidade, ela tem Setor, mas você não tem a entity setor.

Para funcionar, você precisa remover o setor, já que a entidade setor não existe…

Mas vc pode perguntar… mas eu preciso de setor.

Então você precisa criar a entity setor.

Faça estes testes e qq coisa post aqui

Abraço,

Marcelo Gomes

A
marcelogomesrp:
Seguinte,

Olhando na sua entidade, ela tem Setor, mas você não tem a entity setor.

Marcelo, me desculpe mas não entendi direito... a entity setor não seria essa:

Class Setor
package teste;

// Generated 06/10/2011 17:33:07 by Hibernate Tools 3.4.0.CR1

import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * Setor generated by hbm2java
 */
@Entity
@Table(name = "setor", catalog = "test")
public class Setor implements java.io.Serializable {

	private Byte id;
	private String setor;
	private Set<Usuario> usuarios = new HashSet<Usuario>(0);

	public Setor() {
	}

	public Setor(String setor, Set<Usuario> usuarios) {
		this.setor = setor;
		this.usuarios = usuarios;
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "id", unique = true, nullable = false)
	public Byte getId() {
		return this.id;
	}

	public void setId(Byte id) {
		this.id = id;
	}

	@Column(name = "setor", length = 20)
	public String getSetor() {
		return this.setor;
	}

	public void setSetor(String setor) {
		this.setor = setor;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "setor")
	public Set<Usuario> getUsuarios() {
		return this.usuarios;
	}

	public void setUsuarios(Set<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

}

Desde já muito obrigado.

Abraços
Anderson

M

Verdade, você esta certo.

Eu costumo colocar a anotação

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "idsetor")

Antes da declaração do atributo e não no método, mas acredito que isso não via influenciar…

Olhando com mais atenção, não consegui achar o erro, vou refazer seus passos e gerar o mesmo código para ver o que rola e posto aqui depois.

obs.: Acho que vou conseguir fazer isso só no domingo pela manhã, se ninguém tiver solucionado antes.

Abraço,

Marcelo Gomes

A

Muito obrigado Marcelo pelo retorno, ficarei no aguardo, e enquanto isso vou efetuando uns testes aqui tb.

Abraços
Anderson

M

Opá,

Não deu para fazer no domingo, mas fiz hoje.

O que gerei seguindo os procedimento que você disse, não deu erro, agora seria legal compara um com o outro para tentar achar o que pode estar errado e gerando este erro.

Eu gravei um vídeo enquanto fazia a simulação, o mesmo pode ser visto aqui http://notepadexe.wordpress.com/2011/10/10/java-gerando-e-usando-entity-do-mysql/ e também coloquei um link para download do projeto.

Como levantei mais cedo para fazer isso a voz esta de sono, mas da para entender… :smiley:

Obrigado,

Marcelo Gomes

A

Marcelo obrigadão mesmo pela atenção.
Acabei de ver o post, show de bola a vídeo aula, já baixei o projeto.
Turante a vídeo aula notei que as anotações ficaram bem diferentes das que eu fiz, deve ter cito pelo fato que eu utilizei o eclipse, não sei se pode estar ai o erro né.
Eu vou fazer a comparação dos códigos como você havia dito, ai depois eu posto o resultado.

Valew mesmo.

Abraços,
Anderson

A

Ola pessoal, fiz a comparação com os códigos e fiz alguns testes, e o problema era nas anotações mesmos, criei as classes geradas pelo netbeans como mostra na vídeo alua que o Marcelo fez, e usei no meu projeto no eclipse e funcionou certinho.

Note a diferença nas anotações

Gerado como na vídeo aula.

@Entity @Table(name = "setor") @XmlRootElement @NamedQueries({ @NamedQuery(name = "Setor.findAll", query = "SELECT s FROM Setor s"), @NamedQuery(name = "Setor.findById", query = "SELECT s FROM Setor s WHERE s.id = :id"), @NamedQuery(name = "Setor.findBySetor", query = "SELECT s FROM Setor s WHERE s.setor = :setor")}) public class Setor implements Serializable {

Gerado pelo Hibernate Tools no Eclipse.

@Entity @Table(name = "setor", catalog = "test") public class Setor implements java.io.Serializable {

Abraços, pessoal
Muito obrigado

Criado 6 de outubro de 2011
Ultima resposta 24 de out. de 2011
Respostas 11
Participantes 3