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:
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:
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!
Leave a Reply