• 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: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements

December 14, 2015 by Mauda Leave a Comment

Conteúdo do Post:
  1. Descrição do Erro
  2. Solução
  3. finally{

Olá Pessoal, tudo bom?

Hoje iremos falar sobre erro de Mapeamento de Entidades JPA, mais especificamente da exception Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements.

Descrição do Erro

Ao mapear associações entre entidades via JPA do tipo One to Many ou Many to Many, a qual são coleções e devem ser representadas dessa forma, nós devemos utilizar as annotations javax.persistence.@OneToMany ou javax.persistence.@ManyToMany. Ao representarmos essa coleção com uma classe que implementa uma interface da Collection, 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
30
31
32
package br.com.mauda.example.model;
 
import java.io.Serializable;
import java.util.ArrayList;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
 
 
@Entity
public class Artista implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
private Long id;
private String nome;
@ManyToMany
@JoinTable(name="TB_ARTISTA_EVENTO",
   joinColumns={@JoinColumn(name="ID_EVENTO")},
   inverseJoinColumns={@JoinColumn(name="ID_ARTISTA")})
private ArrayList<Evento> eventos;
 
public Artista(){
}
//outros atributos, métodos e construtores
}

Ao invés de utilizar a interface java.util.List, nós estamos utilizando a classe que implementa essa interface java.util.ArrayList. Com isso irá causar o seguinte erro apresentando pela stack trace:

org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: br.com.mauda.example.model.Artista.eventos: at org.hibernate.cfg.annotations.CollectionBinder.getCollectionBinder(CollectionBinder.java:328)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1849)
at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:895)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:728)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3568)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3522)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1379)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1784)
at br.pucpr.ticketsAereos.dao.util.HibernateUtil.getSessionFactory(HibernateUtil.java:23)
at br.pucpr.ticketsAereos.dao.util.HibernateUtil.getSession(HibernateUtil.java:29)
… 35 more

 

Solução

Como já descrito acima, a solução para este erro é modificar a declaração da variável que contempla a coleção, de uma classe que implementa a interface collection para a interface collection. O código abaixo mostra essa mudança:

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
30
31
32
package br.com.mauda.example.model;
 
import java.io.Serializable;
import java.util.List;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
 
 
@Entity
public class Artista implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
private Long id;
private String nome;
@ManyToMany
@JoinTable(name="TB_ARTISTA_EVENTO",
   joinColumns={@JoinColumn(name="ID_EVENTO")},
   inverseJoinColumns={@JoinColumn(name="ID_ARTISTA")})
private List<Evento> eventos;
 
public Artista(){
}
//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: Erros, Hibernate, Java, JPA Tagged With: Entidades, Erros, Exceptions, Hibernate, Java, JPA, Mapeamento

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

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