Erro: Hibernate - Use of @OneToMany or @ManyToMany targeting an unmapped class:

3 respostas
S

Pessoal...
Estou tentando fazer o relacionamento de muitos pra muitos...
Muitas Empresas tem Muitos Telefones...

Estou com o seguinte erro:

Exception in thread "main" org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: modelo.Empresa.telefones[modelo.Telefone]
	at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1033)
	at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:576)
	at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:517)
	at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:43)
	at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1130)
	at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:316)
	at org.hibernate.cfg.Configuration.generateDropSchemaScript(Configuration.java:756)
	at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:93)
	at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:61)
	at hibernate.TabelasFactory.create(TabelasFactory.java:9)
	at hibernate.TabelasFactory.main(TabelasFactory.java:16)

Minha Classe Telefone:

package modelo;

import java.io.Serializable;
import java.util.Collection;

import javax.persistence.Column;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Entity;


@Entity //Anotação que informa que esta classe é de persistência
@Table(name="telefone", schema="nolugar") //Anotação que informa a tabela e esquema mapeada
public class Telefone implements Serializable{
	
	private static final long serialVersionUID = 1L;

	@Id //Definição da chave primária
	@GeneratedValue(strategy = GenerationType.IDENTITY) //Definição do mecanismo da chave primária
	@Column(name="idtelefone") //Definição da coluna mapeada para o atributo
	private int		idTelefone;
	
	@Column(name="telefone")
	private String 	telefone;
	
	@ManyToMany(fetch=FetchType.LAZY)
	@JoinTable(name="empresa_telefone", schema="nolugar",
	joinColumns=@JoinColumn(name="idtelefone"),
	inverseJoinColumns=@JoinColumn(name="idempresa"))
	private Collection<Empresa> empresas;

	public Collection<Empresa> getEmpresas() {
		return empresas;
	}
	public void setEmpresas(Collection<Empresa> empresas) {
		this.empresas = empresas;
	}
	public int getIdTelefone() {
		return idTelefone;
	}
	public void setIdTelefone(int idTelefone) {
		this.idTelefone = idTelefone;
	}
	public String getTelefone() {
		return telefone;
	}
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
}

Minha Classe Empresa:

package modelo;


import java.io.Serializable;
import java.sql.Blob;
import java.util.Collection;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity //Anotação que informa que esta classe é de persistência
@Table(name="empresa", schema="nolugar") //Anotação que informa a tabela e esquema mapeada
public class Empresa implements Serializable {
	
	private static final long serialVersionUID = 1L;

	@Id //Definição da chave primária
	@GeneratedValue(strategy = GenerationType.IDENTITY) //Definição do mecanismo da chave primária
	@Column(name="idempresa") //Definição da coluna mapeada para o atributo
	private int		idEmpresa;
	
	@ManyToMany(fetch=FetchType.LAZY)
	@JoinTable(name="empresa_telefone", schema="nolugar",
	joinColumns=@JoinColumn(name="idempresa"),
	inverseJoinColumns=@JoinColumn(name="idtelefone"))
	private Collection<Telefone> telefones;

	public int getIdEmpresa() {
		return idEmpresa;
	}
	public void setIdEmpresa(int idEmpresa) {
		this.idEmpresa = idEmpresa;
	}
	public Collection<Telefone> getTelefones() {
		return telefones;
	}
	public void setTelefones(Collection<Telefone> telefones) {
		this.telefones = telefones;
	}
}

Meu gerador de tabelas:

package hibernate;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class TabelasFactory {   
  
    public static void create(AnnotationConfiguration cfg) {   
        new SchemaExport(cfg).create(false, true);   
    }   
  
    public static void main(String[] args) {
    	AnnotationConfiguration cfg = new AnnotationConfiguration();
        cfg.addAnnotatedClass(modelo.Empresa.class);
        cfg.addAnnotatedClass(modelo.Telefone.class);
        create(cfg);   
  
    }   
}

Meu 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>
		<!-- properties -->
		
		<property name="connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		
		<property name="connection.url">
			jdbc:mysql://localhost/noLugar
		</property>
		
		<property name="dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
		
		<property name="show_sql">true</property>
		<property name="connection.username">root</property>
		<property name="connection.password">123</property>
		<property name="connection.pool_size">10</property>
		
		<!-- mapping classes -->
		<mapping class="modelo.Empresa" />
		<mapping class="modelo.Telefone" />
	</session-factory>
</hibernate-configuration>

Alguem saberia me indicar qual o possível erro?

3 Respostas

L

Cara,

tenta mudar

Ou, seja, retirar do plural.

Infelizmente, não tenho como testar isso agora…
Mas acho que o problema é por aí.

Outra tentativa é usar @MappedBy.

Boa sorte.

Abração.

J

o nome da propriedade não tem nada a ver… ate pq é convenção usar olural para indicar varias instancias de uma classe.
o peoblema esta aqui:

import org.hibernate.annotations.Entity;

vc precisa usar:

import javax.persistence.Entity;

da mesma maneira que na outra classe.

[]´s

M

Só uma observação já que no seu cfg.xml você já está mapeando as classes,:

...
        <!-- mapping classes -->   
        <mapping class="modelo.Empresa" />   
        <mapping class="modelo.Telefone" />   
...

Você pode mudar

AnnotationConfiguration cfg = new AnnotationConfiguration();   
        cfg.addAnnotatedClass(modelo.Empresa.class);   
        cfg.addAnnotatedClass(modelo.Telefone.class);   
        create(cfg);

Para apenas isso

AnnotationConfiguration cfg = new AnnotationConfiguration();   
      cfg.configure();
        create(cfg);

Eu por exemplo só uso cfg.addAnnotatedClass quando eu uso o hibernate.properties invés do cfg.xml

Criado 29 de novembro de 2007
Ultima resposta 29 de nov. de 2007
Respostas 3
Participantes 4