• 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 – java.lang.ClassCastException: org.hibernate.mapping.JoinedSubclass cannot be cast to org.hibernate.mapping.RootClass

June 22, 2015 by Mauda 2 Comments

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

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:

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
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:

Java
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!

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

Comments

  1. gustavo machado says

    September 11, 2015 at 11:33 am

    amigo, e como ficaria essa herança se na classe filha, eu tivesse uma chave composta ? é possível fazer esse tipo de mapeamento ?

    Reply
    • Mauda says

      September 13, 2015 at 8:47 pm

      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

      Reply

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