Olá Pessoal, tudo bom?
Hoje iremos falar sobre mais um erro de Mapeamento de Entidades JPA, especificamente da exception org.hibernate.MappingException: Could not determine type for: java.util.List, at table
Descrição do Erro
Uma associação entre classes possui quatro formatos distintos caracterizados pela cardinalidade de cada associação. Estes podem ser OneToOne, OneToMany, ManyToOne e ManyToMany. Ao representar uma associação em uma classe Java dependendo da cardinalidade podemos representar por atributos simples, somente a instância de uma classe, ou por atributos múltiplos, utilizando Lists, Sets ou qualquer outra estrutura de dados representadas na API Collection.
Todos os atributos de uma classe Java são automaticamente mapeados pelo JPA. Assim um atributo representado na classe indica para o JPA que existe uma coluna na tabela com o mesmo nome do atributo.
Ao não representar uma associação com as annotations específicas, o JPA irá gerar um erro com uma stack trace muito parecida com a seguinte stack:
org.hibernate.MappingException: Could not determine type for: java.util.List, at table: NomeEntidade, for columns: [org.hibernate.mapping.Column(br.pucpr.bsi.prog6.ticketsEventosBSI.model.Evento)]
at org.hibernate.cfg.InheritanceState.determineDefaultAccessType(InheritanceState.java:277)
at org.hibernate.cfg.InheritanceState.getElementsToProcess(InheritanceState.java:224)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:707)
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.bsi.prog6.ticketsEventosBSI.dao.util.HibernateUtil.getSessionFactory(HibernateUtil.java:23)
at br.pucpr.bsi.prog6.ticketsEventosBSI.dao.util.HibernateUtil.getSession(HibernateUtil.java:29)
at br.pucpr.bsi.prog6.ticketsEventosBSI.dao.PatternDAO.insert(PatternDAO.java:84)
at br.pucpr.bsi.prog6.ticketsEventosBSI.bc.ArtistaBC.insert(ArtistaBC.java:29)
… 35 more
Solução
A solução para este erro é criar o mapeamento correto do banco de dados utilizando annotations correspondentes para realizar este mapeamento. Assim é necessário utilizar a combinação das seguintes anotações:
- javax.persistence.@OneToOne
- javax.persistence.@OneToMany
- javax.persistence.@ManyToOne
- javax.persistence.@ManyToMany
Com as seguintes annotations:
- javax.persistence.@JoinColumn
- javax.persistence.@JoinTable
Por exemplo no código abaixo repare que existe uma associação com a classe Evento, a qual é ManyToMany entre a classe Artista. Dessa forma existe uma representação de uma tabela associativa, o qual descrevemos através da annotation @JoinTable e a annotation @ManyToMany que representa a cardinalidade da associação.
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 |
package br.com.mauda.example.model; import java.io.Serializable; 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