Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

31
respostas

Erro ao executar insert em DAOGENERICO

Alguem sabe o motivo deste erro

Exception in thread "main" java.lang.IncompatibleClassChangeError: class org.hibernate.ejb.HibernatePersistence has interface org.hibernate.ejb.AvailableSettings as super class at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$100(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at javax.persistence.spi.PersistenceProviderResolverHolder$PersistenceProviderResolverPerClassLoader$CachingPersistenceProviderResolver.loadResolverClasses(PersistenceProviderResolverHolder.java:150) at javax.persistence.spi.PersistenceProviderResolverHolder$PersistenceProviderResolverPerClassLoader$CachingPersistenceProviderResolver.(PersistenceProviderResolverHolder.java:130) at javax.persistence.spi.PersistenceProviderResolverHolder$PersistenceProviderResolverPerClassLoader.getPersistenceProviders(PersistenceProviderResolverHolder.java:88) at javax.persistence.Persistence.getProviders(Persistence.java:75) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) at br.com.empresa.connection.ConnectionFactory.(ConnectionFactory.java:9) at br.com.empresa.DAO.DaoGenerico.(DaoGenerico.java:10) at br.com.empresa.testclasse.InsertApplication.main(InsertApplication.java:12)

31 respostas

De acordo com a definição do Javadoc do erro:

"Thrown when an incompatible class change has occurred to some class definition. The definition of some class, on which the currently executing method depends, has since changed."

https://docs.oracle.com/javase/7/docs/api/java/lang/IncompatibleClassChangeError.html

Ou seja, provavelmente é um erro de sync com alguma biblioteca/classe alterada e não refletida no código. Tenta dar um clean no projeto e recompila-lo.

O procedimento que falou resolveu o erro mas veio outro

Erro: Não foi possível localizar nem carregar a classe principal

Olha só o que ocorre:

Se eu der um clear no Maven ele remove o primeiro erro e da o segundo erro , mas se ser um update Project ele volta o primeiro erro

Estranho. Verifica se o pacote class está configurado no build path e se a classe gerada está por lá. Se não estiver, é algum erro de configuração da compilação.

sim , esta no Source seria isto

Qual o ambiente que você está tentando rodar isso? Via CMD? Dentro do Eclipse, num projeto web?

Dentro do eclipse a classe e para desk e depois vou modificar para rodar em web

mas a principio uma classe java dentro do eclipse

Então é dentro de um main? Poderia colocar o código em questão?

classe insert public class InsertApplication {

public static void main(String[] args) {

Pessoa pessoa = new Pessoa();

DaoGenerico daoPessoa = new DaoGenerico();

pessoa.setNome("eu"); pessoa.setIdade(28);

daoPessoa.saveOrUpdate(pessoa);

System.out.println("Entidades salvas com sucesso!");

} }

e todo vez que executo vem o erro Exception in thread "main" java.lang.IncompatibleClassChangeError: class

Acho que entendi.

Você está usando um método específico do Hibernate (saveOrUpdate) que não é especificada pela JPA. Tente usar o persist no lugar do saveOrUpdate (isso se você estiver usando o saveOrUpdate dentro do método da dao)

Coloquei mas informa que não e compatível

mesmo colocando o persiste na dao

package br.com.empresa.DAO;

import javax.persistence.EntityManager;

import br.com.empresa.connection.ConnectionFactory; import br.com.empresa.DAO.EntidadeBase;

public class DaoGenerico {

private static EntityManager manager = ConnectionFactory.getEntityManager();;

public T findById(Class clazz, Long id){ return manager.find(clazz, id); }

public void saveOrUpdate(T obj){ try{ manager.getTransaction().begin(); if(obj.getId() == null){ manager.persist(obj); }else{ manager.merge(obj); } manager.getTransaction().commit(); }catch(Exception e){ manager.getTransaction().rollback(); } }

public void remove(Class clazz, Long id){ T t = findById(clazz, id); try{ manager.getTransaction().begin(); manager.remove(t); manager.getTransaction().commit(); }catch (Exception e) { manager.getTransaction().rollback(); } }

}

o que teria que mudar na dao

ao modificar para persist

Erro :

Exception in thread "main" java.lang.IncompatibleClassChangeError:

ao dar um clean no maven

Erro: Não foi possível localizar nem carregar a classe principal

Você poderia listar as libs + versão presentes no seu buildpath?

Além disso, tente dar um clean NO PROJETO (project > clean)

pom,xml

4.0.0 br.com.empresa empresa 0.0.1-SNAPSHOT org.primefaces primefaces 5.1 compile org.hibernate hibernate-core 5.2.0.Final org.hibernate hibernate-entitymanager 5.2.8.Final org.hibernate.javax.persistence hibernate-jpa-2.0-api 1.0.1.Final org.primefaces.themes bootstrap 1.0.10 org.ajax4jsf ajax4jsf 1.0.5 org.postgresql postgresql 9.4-1206-jdbc42 org.wildfly wildfly-feature-pack 9.0.0.Final pom provided org.webjars font-awesome 4.7.0 org.javassist javassist 3.22.0-CR2 javax.el el-api 2.2 provided javax.servlet javax.servlet-api 3.1.0 provided org.slf4j slf4j-log4j12 1.7.5 cglib cglib 2.2.2 asm asm-util 3.3.1 prime-repo PrimeFaces Maven Repository http://repository.primefaces.org default

Tenta colocar as dependências do hibernate na mesma versão. No caso, alterar a hibernate-core 5.2.0.Final pra hibernate-core 5.2.8.Final, pra ficar igual à hibernate-entitymanager

Apos fazer o que falou olha o erro

Exception in thread "main" java.lang.ExceptionInInitializerError at br.com.empreasa.DAO.DaoGenerico.(DaoGenerico.java:10) at br.com.empresa.testclasse.InsertApplication.main(InsertApplication.java:12) Caused by: javax.persistence.PersistenceException: No Persistence provider for EntityManager named PersistenciaPU at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39) at br.com.empresa.connection.ConnectionFactory.(ConnectionFactory.java:9) ... 2 more

Esse erro foi porque o nome da sua persistence que você tenta instanciar (PersistenciaPU) não está configurada no arquivo persistence.xml.

Esta la :

<?xml version="1.0" encoding="UTF-8"?>

org.hibernate.ejb.HibernatePersistence br.com.empresa.control.Usuario br.com.empresa.model.Pessoa br.com.empresa.model.ClientesFornecedores br.com.empresa.model.Empresa
<?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="PersistenciaPU">

        <!-- provedor/implementacao do JPA -->
         <!-- <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>-->
         <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <!-- entidade mapeada -->
        <class>br.com.empresa.control.Usuario</class>
        <class>br.com.empresa.model.Pessoa</class>
        <class>br.com.empresa.model.ClientesFornecedores</class>
        <class>br.com.empresa.model.Empresa</class>


        <properties>
            <!-- dados da conexao -->
                <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
                <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/db" />
                <property name="javax.persistence.jdbc.user" value="postgres" />
                <property name="javax.persistence.jdbc.password" value="senha" />

             <!-- propriedades do hibernate -->
                <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
                <property name="hibernate.hbm2ddl.auto" value="update" />
                <property name="hibernate.show_sql" value="true" />
                <property name="hibernate.format_sql" value="true" />

             <!-- atualiza o banco, gera as tabelas se for preciso -->
              <property name="hibernate.hbm2ddl.auto" value="update" />

        </properties>
    </persistence-unit>
</persistence>

Isso é apenas a listagem dos modelos que o hibernate mapeia.

Poste o arquivo de persistence completo e tenha certeza que ela está na pasta META-INF, dentro da sua pasta source do projeto.

Caso não seja o caso da localização da pasta, tente mudar o provider pro

org.hibernate.jpa.HibernatePersistenceProvider

troquei .. cada hora um erro ,, Eterno kkkkk

Exception in thread "main" java.lang.AbstractMethodError
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:278)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:445)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:889)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
    at br.com.empresa.connection.ConnectionFactory.<clinit>(ConnectionFactory.java:9)
    at br.com.empresa.DAO.DaoGenerico.<clinit>(DaoGenerico.java:10)
    at br.com.empresa.testclasse.InsertApplication.main(InsertApplication.java:12)

Respira, 1,2, vamos tentar de novo.

Por sorte eu já tive um problema desse aí no trabalho. Coloque provided nas dependências no maven. Isso faz com que o tomcat ou qualquer outro servidor use as bibliotecas que você forneceu e não a dele. No meu caso isso apareceu porque a que ele tinha por padrão estava conflitando com as minhas, que ele estava ignorando.

No caso, ficaria assim, por exemplo:

<dependency>
    <groupId>xxxxx</groupId>
    <artifactId>xxxxx</artifactId>
    <version>xxxxxxx</version>
    <scope>provided</scope>
    </dependency>

add provided e não teve efeito , mesmo erro

add uma lib e olha a mensagem

Exception in thread "main" java.lang.IncompatibleClassChangeError: class org.hibernate.ejb.HibernatePersistence has interface org.hibernate.ejb.AvailableSettings as super class
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at javax.persistence.spi.PersistenceProviderResolverHolder$PersistenceProviderResolverPerClassLoader$CachingPersistenceProviderResolver.loadResolverClasses(PersistenceProviderResolverHolder.java:150)
    at javax.persistence.spi.PersistenceProviderResolverHolder$PersistenceProviderResolverPerClassLoader$CachingPersistenceProviderResolver.<init>(PersistenceProviderResolverHolder.java:130)
    at javax.persistence.spi.PersistenceProviderResolverHolder$PersistenceProviderResolverPerClassLoader.getPersistenceProviders(PersistenceProviderResolverHolder.java:88)
    at javax.persistence.Persistence.getProviders(Persistence.java:75)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
    at br.com.empresa.connection.ConnectionFactory.<clinit>(ConnectionFactory.java:9)
    at br.com.empresa.DAO.DaoGenerico.<clinit>(DaoGenerico.java:10)
    at br.com.empresa.testclasse.InsertApplication.main(InsertApplication.java:12)

agora

Exception in thread "main" java.lang.AbstractMethodError

Cara, acabou minhas ideias já hahaha

Esse erro de Exception in thread "main" java.lang.AbstractMethodError é por conta de conflito de bibliotecas. Como falei, já tinha dado comigo a um tempo atrás, infelizmente minha solução não funcionou com você.

Sugiro recomeçar o projeto e fazer uma coisa super simples e funcional e ir incrementando aos poucos (não sei de que se trata esse projeto aí), e sempre acrescentando as libs apenas quando necessário.

Valeu cara mesmo , vou ver aqui e te falo

mas mesmo assim valeu ajuda