Olá Pessoal, tudo bom?
Hoje iremos falar sobre mais um erro de Mapeamento de Entidades JPA, especificamente da exception java.lang.ClassCastException: org.hibernate.mapping.JoinedSubclass cannot be cast to org.hibernate.mapping.RootClass
Descrição do Erro
Para que uma Herança dentro da Orientação a Objetos possa ser refletida em um Banco de Dados Relacional existem 3 estratégias possíveis:
- Criando uma Tabela Única que armazene todas as informações da Herança
- Criando Tabelas somente para as classes Concretas de sua Herança
- Criando Tabelas para todas as classes de sua Herança
Essas estratégias também estão presentes dentro do mapeamento de JPA. E sempre que estamos trabalhando com Herança é necessário lembrar que as classes filhas herdam os atributos da classe pai.
Assim ao realizar o mapeamento de uma Herança via Tabelas para todas as classes da Hierarquia (JOINED) e você construir um código parecido com o seguinte para a classe Pai:
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 |
package br.com.mauda.example.model; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.DiscriminatorColumn; import javax.persistence.DiscriminatorType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.Table; @Entity @Inheritance(strategy= InheritanceType.JOINED) @DiscriminatorColumn(name="tipo", length=10, discriminatorType= DiscriminatorType.STRING) public abstract class FatherJoinedClass implements IdentifierInterface, Serializable { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; private String nome; } |
E para a classe Filha:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package br.com.mauda.example.model; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity @DiscriminatorValue(value="Tipo1") public class SonJoinedClass extends FatherJoinedClass { @Id @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) private Long id; } |
Irá gerar um erro com uma stack trace muito parecida com a seguinte stack:
java.lang.ClassCastException: org.hibernate.mapping.JoinedSubclass cannot be cast to org.hibernate.mapping.RootClass
at org.hibernate.cfg.annotations.PropertyBinder.bind(PropertyBinder.java:214)
at org.hibernate.cfg.annotations.PropertyBinder.makePropertyValueAndBind(PropertyBinder.java:205)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2166)
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.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)
… 35 more
Solução
A solução para este erro é remover o atributo id, junto com seu mapeamento, da classe Filha, dessa forma o mapeamento será executado de forma correta.
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!
gustavo machado says
amigo, e como ficaria essa herança se na classe filha, eu tivesse uma chave composta ? é possível fazer esse tipo de mapeamento ?
Mauda says
Olá Gustavo, tudo bom?
Fiquei na duvida. A chave composta estaria em toda a hierarquia, ou a partir da classe filha você iria ter a chave composta? Além disso, qual é o formato da sua base de dados e qual a estratégia de mapeamento você irá utilizar, Single Table, Table per Class ou Joined. Isso ajuda a te dar um help. Obrigado. Mauda