Erro de persistencia com JPA

38 respostas
A

Ola pessoal tudo bem? Estou tentando fazer a persistencia usando o JPA e ja tentei diversas formas e nao consigo, sempre lanca uma excepcao dizendo que a minha classe nao foi encontrada. Por favor quem puder me ajude, ABRACOS.

Persistencia.xml (Configuracao de persistencia )

38 Respostas

H

você precisa adicionar no seu projeto uma biblioteca chamada Jandex, eu uso jandex2.0.4. Acabei de fazer o teste com de outra pessoa e era esse o problema.

A

Obrigado amigo, vou baixar entao, abracos.

A

Pesquisei como fazer a persistencia e vi que ha duas formas, um com session factory e outro com entitymanagerfactory, a fabrica de coneccao era totalmente diferente podi me explicar a diferenca?

H

http://www.guj.com.br/t/diferenca-entre-session-e-entitymanager-do-jpa/196561/2
Veja esse link que explica melhor, mas vou adiantar que entitymanagerfactory tem portabilidade e pode ser usado em outros programas que usam JPA como EclipseLink e o session factory apenas no Hibernate.

A

Ok, vou dar uma olhada, ja baixei a biblioteca jadex mas nao funcionou pode me enviar o link para baixar o jadex por favor amigo?

H

https://mvnrepository.com/artifact/org.jboss/jandex/2.0.4.Final depois clica em bundle que vai fazer o download.

A

Ja consigue amigao voce me salvou haha abracos:ok_hand:

A

@Heitor_Veloso cara desculpa ai, da outra vez eu consigue criar a tabela no banco, o problema agora e que esta dando um outro erro, da uma olha por favor

Camada de persistencia

H

coloca aqui para eu ver a classe JPAUtil, pois pelo erro apresentado parece ser algo nela, por exemplo se você tiver fechado a conexão ele não vai conseguir achar nada na linha abaixo.

A

Apos isso, o que eu fiz foi desmarcar a opcao de gerar tabela porque ja esta criado sera que esta correto?

Todos os directorios e bibliotecas do projecto abaixo:

H

aconselho a você fazer diferente conforme vou sugerir.

primeira alteração na classe persistência, vou postar só até onde deve mudar.

public class Persistencia {
          public static void main(String[] args) {
                JPAUtil conexao = new JPAUtil();
                EntityMangaer em = conexao.getEntityManager();
}

na segunda sugiro a alteração apenas onde está escrito static{} muda para o que vou postar abaixo, e caso continue dando o mesmo erro ou outro avisar;

public JPAUtil(){
           factory = Persistence.createEntityManagerFactory("JPAPU");
}

pois o que eu entendi vendo a sua classe JPAUtil você não chamava o Persistence.createEntityManagerFactory(“JPAPU”);” antes de chamar o metodo que retorna o EntityManager.
Em relação ao none do xml está parcialmente correto, pois o certo é colocar no xml além de deixar em none o seguinte

<property name="hibernate.hbm2ddl.auto" value="update"/>

A

Ja fiz todas as mudanca mais continua o mesmo da uma olhada:

JPAUTIL:

PERSISTENCIA:

PERSISTENCE.xml:

Estou baseando em algumas apostilas e todos mostran da mesma forma e nenhum esta funcionando

H

no seu main acho que não há a necessidade do EntityTransaction tx, comenta a linha dele, depois muda tx.commit(); para em.commit(); e por fim troca JPAUtil.close(); para conexao.close(); Depois que fizer isso, continuando o erro da um novo print nele para eu ver onde está dando o erro.

A

Entao em.getTransaction( ).commit( ); porque o entitymanager so tem esse.
em.commit nao aparece.

ALTERACAO:

ERRO:

OBS:EU FIZ USANDO O HIBERNATE SEM ESPECIFICACAO DO JPA E FUNCIONOU TUDO, JA COM O JPA NAO FUNCIONA E NAO ENTENDO.

H

você está certo, me passa seu código todo que olha para você é só aqui no comentario uilizar a tag </> para colocar seu código, pois por imagem fica bem mais dificil até copiar tudo. Aqui não da para eu ver qual é a linha 27 da classe JPAUtil, pois apenas ela está sem a numeração, pode ser problema de ter posto o static, ou pode ser outro, pode ser até no mapeamento de veículo. Pois comparei o seu código com o meu e nas coisas que você postou não estou vendo diferenças.

A

ok vou enviar o meu codigo.

A

package com.model;

import com.factory.JPAUtil;
import javax.persistence.EntityManager;

/**
*

  • @author Programmer
    */
    public class Persistencia {

    public static void main(String[] args) {

    JPAUtil conexao = new JPAUtil();
     EntityManager em = conexao.getEntityManager();
    
     em.getTransaction().begin();
    
     Veiculo v = new Veiculo();
     v.setNome("BBBBBB");
     v.setMarca("AAAAAA");
    
     em.persist(v);
     em.getTransaction().commit();
     em.close();
    

    }
    }//FIM DA PERSISTENCIA

##############################################

package com.factory;

import javax.persistence.EntityManager;

import javax.persistence.EntityManagerFactory;

import javax.persistence.Persistence;

/**
*

  • @author Programmer
    */
    public class JPAUtil {

    private static EntityManagerFactory factory;

    public JPAUtil() {

    factory = Persistence.createEntityManagerFactory("JPAPU");
    

    }

    public EntityManager getEntityManager() {

    return factory.createEntityManager();
    

    }

    public static void close() {

    factory.close();
    

    }

}//FIM DO JPAUtil

###################################################

package com.model;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import <a href="http://javax.persistence.Id">javax.persistence.Id</a>;

/**
*

  • @author Programmer
    */
    @Entity
    public class Veiculo {

    private int id;
    
    private String nome;
    
    private String marca;
    
    @Id
    
    @GeneratedValue
    
    public int getId() {
    
    return id;
    
    }
    
    public void setId(int id) {
    
    <a href="http://this.id">this.id</a> = id;
    
    }
    
    public String getNome() {
    
    return nome;
    
    }
    
    public void setNome(String nome) {
    
    this.nome = nome;
    
    }
    
    public String getMarca() {
    
    return marca;
    
    }
    
    public void setMarca(String marca) {
    
    this.marca = marca;
    
    }
    

}//FIM DO VEICULO

H

Usei seu código e deu tudo certo.

abr 08, 2018 7:49:52 PM org.hibernate.ejb.HibernatePersistence logDeprecation
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
abr 08, 2018 7:49:52 PM org.hibernate.ejb.HibernatePersistence logDeprecation
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
abr 08, 2018 7:49:52 PM org.hibernate.ejb.HibernatePersistence logDeprecation
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
abr 08, 2018 7:49:52 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [
	name: JPAPU
	...]
abr 08, 2018 7:49:53 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.1.Final}
abr 08, 2018 7:49:53 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
abr 08, 2018 7:49:53 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
abr 08, 2018 7:49:53 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
abr 08, 2018 7:49:54 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
abr 08, 2018 7:49:54 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/teste1]
abr 08, 2018 7:49:54 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=root, password=****}
abr 08, 2018 7:49:54 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
abr 08, 2018 7:49:54 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
abr 08, 2018 7:49:55 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
abr 08, 2018 7:49:55 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
abr 08, 2018 7:49:56 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000228: Running hbm2ddl schema update
abr 08, 2018 7:49:56 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000102: Fetching database metadata
abr 08, 2018 7:49:56 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000396: Updating schema
abr 08, 2018 7:49:56 PM org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata
INFO: HHH000262: Table not found: Veiculo
abr 08, 2018 7:49:56 PM org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata
INFO: HHH000262: Table not found: Veiculo
abr 08, 2018 7:49:56 PM org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata
INFO: HHH000262: Table not found: Veiculo
abr 08, 2018 7:49:57 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000232: Schema update complete
Hibernate: 
    insert 
    into
        Veiculo
        (marca, nome) 
    values
        (?, ?)

olhei no banco de dados e inseriu. Confere para mim se você tem 3 bibliotecas no seu projeto (jandex 2.0.4, Hibernate4.3x(JPA2.1) e diver JDBC do MySQL) e se você criou anteriormente o database no banco de dados, por exemplo eu usei <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/teste1"/> no persistence.xml, dei o nome da database de teste1.

H

o que coloquei no arquivo persistence.xml abaixo, lembrando de trocar os asteristicos em senha para a sua senha do banco de dados:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="JPAPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>com.model.Veiculo</class>
    <properties>
      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/teste1"/>
      <property name="javax.persistence.jdbc.password" value="****"/>
      <property name="javax.persistence.jdbc.user" value="root"/>
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.format_sql" value="true"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
  </persistence-unit>
</persistence>
A

A

Usei estas bibliotecas acima.
Sera que o meu net beans presica de algum plugin?
Baixei ate a ultima versao do hibernate e na funcionou?

H

Você está usando o JSP e testando como se fosse Java SE, provavelmente esse pode ser um possível erro, se quer testar se vai dar certo a inserção do hibernate te recomendo ir em arquivo->novo projeto->Java->aplicação Java. Depois só você passar seus pacotes para a nova aplicação.

A

@Heitor_Veloso Cara ja funcionou consegue fazer a persistencia, fiz como disseste criei novo projecto SE porque eu estava usando o java web.
Eu achei que nao tinha nenhum problema usar o java web porque eu estava rodando a classe main e nao o servidor de aplicacao.

H

Usar hibernate na aplicação web é bem diferente é criado ao inves de arquivo xml um .cfg, recomendo procurar um exemplo na internet de como fazer. Todo o processo é totalmente diferente.

F

Você está usando o maven?, pode ser que esteja acontecendo conflito de bibliotecas, pesquise todas essa libs são compativeis entre a versão do hibernate, isso é bem comum de acontecer, eu sugiro usar o maven para gerenciar suas libs

D

Não creio que seja conflito.
O persistence.xml, aparentemente, está ok, se você tivesse a propriedade hbm2ddl.auto setada como create ou create-drop, até concordo que tentaria recriar, mas, como está, não justifica.

A

Achei que seria tudo de mesma forma, que era basta usar o arquivo .xml que funcionava tanto para web como para aplicacao desktop

A

Sim eu tinha hbm2ddl todo configurado com o create.

A

O meu foco e rodar hibernate juntamente com o servidor de aplicacao ou seja criar e gerenciar dados atravez do servidor de aplicacao, usando o maven eu nao tenho necessidade de usar o arquivo .xml e .cfg?

A

Pessoal agora precisso gerar a tabela quando rodar o servidor de aplicacao como wildfly, ja tenho o meu tudo configurado, qual o caminho devo comecar?

D

Eu sugiro alterar o hbm2ddl.auto para update, assim, ele só irá criar as tabelas uma única vez. Nas demais, verificará alterações (adição de colunas, tabelas, etc) e nunca removerá tabelas já criadas.

H

Tem muito tempo que não uso java WEB, pois foi somente no aprendizado nos tempos de faculdade que usei, eu lembro que para o hibernate igual a de aplicação desktop quando fiz tive que fazer algumas gambiarras, depois com meu professor ele ensinou o jeito correto em aplicação WEB que criava esse arquivo cfg. Não lembro exatamente como cria, mas do mesmo modo que tem o criar o arquivo persistence.xml quando você no netbeans usa bibliotecas do hibernate para criar, também tem com o cfg. Em um programa antigo que tenho aqui fiz o teste e funcionou.

D

Faz muito tempo que os xmls do hibernate podem ser deixados de lado e se usar, apenas, anotações (exceto quando está se utilizando JPA, aí você é obrigado a ter o persistence.xml).

A

Pessoal qual a melhor forma para eu comecar a programar para web com java.
USAR ESPECIFICACAO DE JAVA WEB OU SPRING BOOT.
NAO SEI SE ESTOU ATUALIZADO SOBRE DESENVOLVIMENTO WEB COM JAVA, QUAL DOS DOIS DEVERIA ADOTAR?

F

Se tiver começando, melhor usar servlet puro no backend e ir se adaptando a tecnologia, depois spring boot(spring boot não é framework web) com spring mvc seria uma boa ideia.

A

Comecei usando o servlet puro para entender os principais conceitos, e agora uso o JSF, entao devo adotar o Spring MVC?

D

Se você se refere a passar com o objetivo de estudar, é uma boa opção.

J

Sei que é meio antigo esse post, fiz um tutorial sobre JPA, com a sua configuração, por favor, veja se ajuda.
Seguem os links:
http://www.tidicas.com.br/?p=1864
http://www.tidicas.com.br/?p=130

Criado 8 de abril de 2018
Ultima resposta 14 de dez. de 2020
Respostas 38
Participantes 5