3
respostas

Recebendo exception ao usar strategy = InheritanceType.JOINED

Olá, boa tarde! Pessoal, estou recebendo uma exception quando eu uso a estratégia JOINED, porém, se eu remover o @Inheritance ou trocar pra SINGLE_TABLE não apresenta essa exception. Se for necessário eu posso colocar mais informações, só pedir. Exception:

abr. 16, 2021 2:16:38 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [name: loja-mysql]
abr. 16, 2021 2:16:39 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate ORM core version 5.4.27.Final
abr. 16, 2021 2:16:39 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
abr. 16, 2021 2:16:39 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
abr. 16, 2021 2:16:39 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/loja]
abr. 16, 2021 2:16:39 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {password=****, user=root}
abr. 16, 2021 2:16:39 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
abr. 16, 2021 2:16:39 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
abr. 16, 2021 2:16:39 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
abr. 16, 2021 2:16:40 PM org.hibernate.AssertionFailure <init>
ERROR: HHH000099: an assertion failure occurred (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: Table loja.produtos not found
abr. 16, 2021 2:16:40 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:mysql://localhost:3306/loja]
Exception in thread "main" java.lang.ExceptionInInitializerError
    at br.com.alura.loja.testes.Teste2.cadastrarLivroEJogo(Teste2.java:115)
    at br.com.alura.loja.testes.Teste2.main(Teste2.java:21)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: loja-mysql] Unable to build Hibernate SessionFactory
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1336)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1262)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    at br.com.alura.loja.br.com.alura.util.JPAUtilMySql.<clinit>(JPAUtilMySql.java:9)
    ... 2 more
Caused by: org.hibernate.MappingException: Could not instantiate persister org.hibernate.persister.entity.JoinedSubclassEntityPersister
    at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:112)
    at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77)
    at org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:181)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:301)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:469)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1259)
    ... 6 more
Caused by: org.hibernate.AssertionFailure: Table loja.produtos not found
    at org.hibernate.persister.entity.AbstractEntityPersister.getTableId(AbstractEntityPer
3 respostas

O erro ocorre quando eu executo esse método na minha classe de teste

    private static void cadastrarLivroEJogo(){
        EntityManager em = JPAUtilMySql.getEntityManager();
        CategoriaDAO categoriaDAO = new CategoriaDAO(em);

        Categoria celulares = categoriaDAO.buscarPorId(1l);
        Livro livro1 = new Livro("Berserk", "Historia do guts", new BigDecimal(50), celulares,
                "Himura Keiji", 500);
        JogoPS5 jogoPS5 = new JogoPS5("COD", "segunda guerra mundial", new BigDecimal(250), celulares,
                "Shooter", "PEGI18");

        System.out.println(livro1);
        em.getTransaction().begin();
        em.persist(livro1);
        em.persist(jogoPS5);
        em.getTransaction().commit();
        em.close();
    }

As classes a seguir estão resumidas, mas se precisar eu posto elas inteiras Minha classe produto

@Entity
@Table(name = "produtos")
@Inheritance(strategy = InheritanceType.JOINED)
public class Produto {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private String descricao;
    private BigDecimal preco;
    private LocalDate dataCadastro = LocalDate.now();
    @ManyToOne(fetch = FetchType.LAZY)
    private Categoria categoria;

Minha classe livro

@Entity
@Table(name = "livros")
public class Livro extends Produto {
    private String autor;
    private Integer numeroDePaginas;

Minha classe Jogo de ps5

@Entity
@Table(name = "jogosPS5")
public class JogoPS5 extends Produto {
    private String genero;
    private String pegi;

Oi Rodrigo,

Na mensagem erro tem: Table loja.produtos not found

Essa tabela não existe no seu banco de dados "loja" e por isso o erro aconteceu.

Então Rodrigo, pior que eu tenho essa tabela sim, como eu disse se eu remover o @Inheritance ou trocar pra SINGLE_TABLE essa exception não acontece Meu BD 'loja' tem tem essas tabelas: categorias, clientes, itens_pedido, pedidos, produtos. Eu coloquei minha classe Produto acima.