• Skip to primary navigation
  • Skip to content

Mauda

IT, Java and Music

Graduação   SCJP   Mestrado
  • Apresentação
  • Certificação Java
  • JPA
    • Exceptions
  • JSF
  • Versionamento
  • Contato

Erros JPA – org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: ClasseOrigem.collection[ClasseDestino]

June 12, 2017 by Mauda 4 Comments

Conteúdo do Post:
  1. Descrição do Erro
  2. Solução
  3. 1) A Entidade Destino (no exemplo, Musica) que está sendo mapeada não possui a annotation javax.persistence.@Entity. Assim é necessário adicionar essa annotation a sua classe Java, como mostra o código abaixo:
  4. 2) A Entidade Destino (no exemplo, Musica) que está sendo mapeada não foi adicionada ao Arquivo hibernate.cfg.xml. Assim é necessário abrir esse arquivo e inserir a entidade com uma tag mapping, como mostra o código abaixo:
  5. 3) A classe Destino (no exemplo, Musica) foi annotada com @Entity e também foi adicionada ao arquivo hibernate.cfg.xml. Você pode ter errado o import!
  6. finally{

Olá Pessoal, tudo bom?

Hoje iremos falar sobre um erro de Mapeamento de Entidades JPA, mais especificamente da exception Use of @OneToMany or @ManyToMany targeting an unmapped class: ClasseOrigem.collection[ClasseDestino].

Descrição do Erro

Ao mapear um atributo de uma entidade JPA, sendo este uma coleção de uma outra entidade JPA é utilizado uma das duas annotations a seguir @OneToMany e @ManyToMany, por exemplo, verifique o código abaixo:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package br.com.mauda.example.model;
 
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
 
@Entity
public class Artista implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
@OneToMany(mappedBy = "artista")
private List<Musica> musicas = new ArrayList<Musica>();
 
public Artista(){
}
//outros atributos, métodos e construtores
}

Assim se foi feito o mapeamento dessa forma e ocorreu um erro com a seguinte stack trace:

org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: br.com.mauda.example.model.Artista.musicas[br.com.mauda.example.model.Musica]
at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1060)
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:734)
at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:669)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:69)
at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1639)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1393)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1784)

Solução

Existem 3 possíveis soluções para essa exceção:

1) A Entidade Destino (no exemplo, Musica) que está sendo mapeada não possui a annotation javax.persistence.@Entity. Assim é necessário adicionar essa annotation a sua classe Java, como mostra o código abaixo:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package br.com.mauda.example.model;
 
import java.io.Serializable;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
 
@Entity
public class Musica implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
//outros atributos, métodos e construtores
}

2) A Entidade Destino (no exemplo, Musica) que está sendo mapeada não foi adicionada ao Arquivo hibernate.cfg.xml. Assim é necessário abrir esse arquivo e inserir a entidade com uma tag mapping, como mostra o código abaixo:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.url">jdbc:hsqldb:hsql://localhost/myServerDB</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">true</property>
<property name="hibernate.connection.pool_size">10</property>
<!-- Mapping files -->
<mapping class="br.com.mauda.example.model.Artista"/>
<mapping class="br.com.mauda.example.model.Musica"/>
</session-factory>
</hibernate-configuration>

3) A classe Destino (no exemplo, Musica) foi annotada com @Entity e também foi adicionada ao arquivo hibernate.cfg.xml. Você pode ter errado o import!

Existem duas anotações @Entity ao trabalhar com JPA + Hibernate. A primeira, que surgiu antes quando não havia a especificação JPA, é a org.hibernate.annotations.Entity e a segunda javax.persistence.Entity, que está dentro da especificação JPA. Ao importar a annotation do Hibernate, ocorrerá a unknownException acima. Assim é necessário importar a anotação do JPA para que o erro não ocorra, como mostra o código abaixo:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package br.com.mauda.example.model;
 
import java.io.Serializable;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
 
//import org.hibernate.annotations.Entity;
 
@Entity
public class Musica implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
//outros atributos, métodos e construtores
}

finally{

Caso você achou mais alguma solução para essa exception, por favor deixe nos comentários abaixo!

Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!

Até um próximo post!

Filed Under: Uncategorized

About Mauda

Mestre em Informática, Analista de Sistemas, Professor, SCJP e Baterista. Desde 2002 trabalhando no mundo Java e ensinando pessoas sobre desenvolvimento de sistemas. Mais informações

Reader Interactions

Comments

  1. Lucas says

    December 10, 2017 at 7:30 pm

    Cara, eu não acredito que esqueci de adicionar a anotação @Entity na minha classe. kkkkkkk

    Obrigadão!

    Reply
    • Mauda says

      December 11, 2017 at 6:33 pm

      Olá Lucas, tudo bom?

      Obrigado pelo Feedback!

      Qualquer duvida estamos aqui!

      Obrigado!

      Reply
  2. Josias Wattrelos says

    March 22, 2019 at 7:25 pm

    E eu me arrancando os cabelos que restam por causa da falta do @Entity…
    Muito obrigado!

    Reply
    • Mauda says

      April 1, 2019 at 8:31 pm

      Olá Josias, tudo bom?

      Legal saber q ajudei!

      Precisando estamos por aqui.

      Obrigado.

      Reply

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Advertisements

Copyright © 2025 · Genesis Framework · WordPress · Log in