[RESOLVIDO]Erro references an unknown entity

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

[code]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 usuarios = new HashSet(0);

    public Setor() {
    }

    public Setor(String setor, Set 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 getUsuarios() {
    return this.usuarios;
    }

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

}[/code]
Class Usuario

[code]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;
    }

}[/code]
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.

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

[quote=marcelogomesrp]Cara não entendi sua duvida… tem como reescrever ?

[/quote]
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.

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.

Marcelo, o único arquivo xml que tenho é esse:
hibernate.cfg.xml

[code]<?xml version="1.0" encoding="UTF-8"?>

org.gjt.mm.mysql.Driver ******* jdbc:mysql://localhost/test root test org.hibernate.dialect.MySQL5Dialect
    <mapping class="teste.Usuario"/>
    <mapping class="teste.Setor"/> 
    
</session-factory>

[/code]

Obrigado

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

[quote=marcelogomesrp]Seguinte,

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

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

Class Setor

[code]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 usuarios = new HashSet(0);

    public Setor() {
    }

    public Setor(String setor, Set 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 getUsuarios() {
    return this.usuarios;
    }

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

}[/code]

Desde já muito obrigado.

Abraços
Anderson

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

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

Abraços
Anderson

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

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

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