Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Exemplo do curso "PERSISTÊNCIA COM JPA" com Eclipselink

Bom dia,

Estou tentando alterar o exemplo do curso (projeto loja) para usar o Eclipselink no lugar do Hibernate.

Basicamente alterei as dependências do Maven retirando o Hibernate, incluindo as dependências do Eclipselink.

O erro que estou obtendo:

javax.persistence.PersistenceException: No Persistence provider for EntityManager named loja.

No arquivo persistence.xml comentei as linhas específicas do Hibernate e inclui:

org.eclipse.persistence.jpa.PersistenceProvider

Alguém poderia me ajudar?

7 respostas

Quais dependências está utilizando? Vc deu um Maven -> Update Project

Boa tarde Rodrigo,

Dependências que estou utilizando:

        <dependency> 
            <groupId>org.eclipse.persistence</groupId> 
            <artifactId>eclipselink</artifactId> 
            <version>3.0.0</version> 
        </dependency>

        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.jpa</artifactId>
            <version>3.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>javax.persistence</artifactId>
            <version>2.2.1</version>
        </dependency>

Já no arquivo persistence.xml:

Isso é necessário?

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

E também:

              <property name="eclipselink.ddl-generation" value="create-tables" />
              <property name="eclipselink.ddl-generation.output-mode" value="database" />         

Sim, fiz o update. Olhando os jars incluídos, dentro de "Maven dependencies", parece estar ok. Estão os JARs do H2, Eclipselink, Eclipse Persistence (JPA, ASM, CORE), Javax Persistence, ...

Segue a Exception completa:

abr. 25, 2021 4:21:03 PM javax.persistence.spi.PersistenceProviderResolverHolder$DefaultPersistenceProviderResolver log WARNING: javax.persistence.spi::No valid providers found. Exception in thread "main" java.lang.ExceptionInInitializerError at br.com.alura.loja.testes.CadastroDeProduto.cadastrarProduto(CadastroDeProduto.java:59) at br.com.alura.loja.testes.CadastroDeProduto.main(CadastroDeProduto.java:25) Caused by: javax.persistence.PersistenceException: No Persistence provider for EntityManager named loja at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:86) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) at br.com.alura.loja.util.JPAUtil.(JPAUtil.java:9) ... 2 more

o nome do seu persistence-unit tá como"loja"?

Para ser mais específico, estes são os JARs:

h2-1.4.200.jar
eclipselink-3.00.jar
org.eclipse.persistence.jpa-3.00.jar
org.eclipse.persistence.asm-3.00.jar
org.eclipse.persistence.core-3.00.jar
org.eclipse.persistence.jpa.jpql-3.00.jar
jakarta.persistence-api-3.00.jar
javax.persistence-2.2.1.jar

Se eu deixo com o Hibernate, funciona normalmente.

Sim, está como "loja":

<persistence-unit name="loja" transaction-type="RESOURCE_LOCAL">

Inclusive se eu apenas altero o Maven para usar o Hibernate, funciona normalmente, com o mesmo persistence.xml

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

<persistence version="2.2"
    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_2.xsd">

    <persistence-unit name="loja" transaction-type="RESOURCE_LOCAL">
        <!-- provider>org.eclipse.persistence.jpa.PersistenceProvider</provider -->

        <class>br.com.alura.loja.modelo.Produto</class>
        <class>br.com.alura.loja.modelo.Categoria</class>

        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <!-- property name="javax.persistence.jdbc.driver" value="dbmaker.sql.JdbcOdbcDriver"/ -->

            <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:loja"/>
            <!-- property name="javax.persistence.jdbc.url" value="jdbc:dbmaker://172.1.1.100:6532/desenv2"/ -->

            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>

            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>  
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>   

            <!-- EclipseLink should create the database schema automatically -->
              <property name="eclipselink.ddl-generation" value="create-tables" />
              <property name="eclipselink.ddl-generation.output-mode" value="database" />         
        </properties>
    </persistence-unit>

</persistence>

Rodrigo, funcionou com essas releases do Eclipselink:

        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>javax.persistence</artifactId>
            <version>2.0.0</version>
        </dependency>

Porém, agora está gerando essa exceção:

[EL Info]: 2021-04-25 17:48:07.51--ServerSession(236840983)--EclipseLink, version: Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5
[EL Info]: connection: 2021-04-25 17:48:07.728--ServerSession(236840983)--file:/F:/desenv/workspace/teste2/loja/target/classes/_loja login successful
[EL Warning]: 2021-04-25 17:48:07.816--UnitOfWork(896072146)--java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: br.com.alura.loja.modelo.Categoria@4b6e2263.
Exception in thread "main" javax.persistence.RollbackException: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: br.com.alura.loja.modelo.Categoria@4b6e2263.
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:157)
    at br.com.alura.loja.testes.CadastroDeProduto.cadastrarProduto(CadastroDeProduto.java:68)
    at br.com.alura.loja.testes.CadastroDeProduto.main(CadastroDeProduto.java:16)
Caused by: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: br.com.alura.loja.modelo.Categoria@4b6e2263.
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.discoverUnregisteredNewObjects(RepeatableWriteUnitOfWork.java:310)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.calculateChanges(UnitOfWorkImpl.java:723)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1516)
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:277)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1169)
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:132)
    ... 2 more

Com o mesmo código que funciona com o Hibernate, com o Eclipselink gera essa exceção. Sabe me dizer o que pode ser?

    public static void main(String[] args) {
        cadastrarProduto();
        }

    private static void cadastrarProduto() {
        Categoria celulares = new Categoria("CELULARES");

        EntityManager em = JPAUtil.getEntityManager();

        em.getTransaction().begin();

        em.persist(celulares);
        celulares.setNome("XPTO");

        em.flush();        
        em.clear();

        /*celulares = em.merge(celulares);
        celulares.setNome("123");
        em.flush();        
        em.clear();*/

        Produto xiaomi = new Produto("Xiaomi", "Modelo X",  new BigDecimal(1234.45), celulares);
        em.persist(xiaomi);

        em.getTransaction().commit();
        em.close();
    }

O erro ocorre no commit.

solução!

Rodrigo,

Agora tudo certo. Em algum dos meus testes eu tinha comentado a linha abaixo da classe Categoria:

@GeneratedValue(strategy = GenerationType.IDENTITY)

Obrigado :-)