- Descrição do Erro
- Soluçã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:
- 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:
- 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!
- 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:
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:
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:
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:
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!
Lucas says
Cara, eu não acredito que esqueci de adicionar a anotação @Entity na minha classe. kkkkkkk
Obrigadão!
Mauda says
Olá Lucas, tudo bom?
Obrigado pelo Feedback!
Qualquer duvida estamos aqui!
Obrigado!
Josias Wattrelos says
E eu me arrancando os cabelos que restam por causa da falta do @Entity…
Muito obrigado!
Mauda says
Olá Josias, tudo bom?
Legal saber q ajudei!
Precisando estamos por aqui.
Obrigado.