Solucionado (ver solución)
Solucionado
(ver solución)
7
respuestas

[Duda] No Persistence provider for EntityManager

A alguien le pasa lo mismo? Estoy en el curso, Java y JPA: consultas avanzadas, rendimiento y modelos complejos Cuando guardo un producto bien, pero al intentar guardar un cliente con el pedido me arroja este error:

abr. 18, 2023 4:37:05 P. M. jakarta.persistence.spi.PersistenceProviderResolverHolder$DefaultPersistenceProviderResolver log
ADVERTENCIA: jakarta.persistence.spi::No valid providers found.
Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.latam.alura.tienda.prueba.RegistroDePedido.registrarPedido(RegistroDePedido.java:34)
    at com.latam.alura.tienda.prueba.RegistroDePedido.main(RegistroDePedido.java:24)
Caused by: jakarta.persistence.PersistenceException: No Persistence provider for EntityManager named store
    at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:86)
    at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
    at com.latam.alura.tienda.utils.JPAUtils.<clinit>(JPAUtils.java:9)

Al parecer es con el EntityManager, funciona en un caso pero luego en la otra clase RegistroPedido no. Bueno ya en ningun caso funciona.

7 respuestas

El error que estás experimentando puede deberse a varios factores. Aquí hay algunas posibles soluciones que podrías intentar:

Verifica si el archivo persistence.xml está en la ubicación correcta. Debe estar en la carpeta src/main/resources/META-INF de tu proyecto.

Asegúrate de que el nombre de la unidad de persistencia en persistence.xml coincida con el nombre utilizado en tu código. En tu caso, parece que el nombre de la unidad de persistencia es "store". Verifica si este nombre coincide con el que está en tu archivo persistence.xml.

Verifica si tienes las dependencias correctas en tu archivo pom.xml (si estás utilizando Maven) o build.gradle (si estás utilizando Gradle). Asegúrate de incluir las dependencias correspondientes a tu proveedor de persistencia, como Hibernate o EclipseLink.

Asegúrate de que no haya conflictos de versiones en las dependencias de tu proyecto. A veces, los conflictos entre versiones de bibliotecas pueden causar problemas inesperados.

Si estás utilizando un servidor de aplicaciones, asegúrate de que esté configurado correctamente para trabajar con Jakarta Persistence (antes conocido como Java Persistence API o JPA).

Felipe Gracias por contestar, lo más extraño es que lo he intentado con código que ya me estaba funcionando, e incluso adelantandome a la otra aula para obtener el código del instructor y nada, llevo 2 días en este proceso y estoy muy frustrado, he detectado conflictos con javax por estar deprecated, y con otro proyecto lo pase fácil a jakarta.

Estas configuraciones las he revisado una y otra vez, icluso viendo tutoriales:

Verifica si el archivo persistence.xml está en la ubicación correcta. Debe estar en la carpeta src/main/resources/META-INF de tu proyecto.

Asegúrate de que el nombre de la unidad de persistencia en persistence.xml coincida con el nombre utilizado en tu código. En tu caso, parece que el nombre de la unidad de persistencia es "store". Verifica si este nombre coincide con el que está en tu archivo persistence.xml

Este es mi 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="store" transaction-type="RESOURCE_LOCAL">

        <properties>
            <property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:E:\Captures\Oracle\9_Java y JPA consultas avanzadas, rendimiento y modelos complejos\H2_files\store"/>
            <property name="jakarta.persistence.jdbc.user" value="Joe"/>
            <property name="jakarta.persistence.jdbc.password" value="1234"/>

            <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="create-drop"/>

        </properties>

    </persistence-unit>

</persistence>

mi pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.latam.alura.tienda</groupId>
    <artifactId>tienda</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.6.14.Final</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>2.1.214</version>
            <scope>test</scope>
        </dependency>

        <!--
        https://mvnrepository.com/artifact/jakarta.platform/jakarta.jakartaee-api -->

        <dependency>
            <groupId>jakarta.platform</groupId>
            <artifactId>jakarta.jakartaee-api</artifactId>
            <version>10.0.0</version>
            <scope>provided</scope>
        </dependency>


    </dependencies>
</project>

Agradexco cualquier Help!

En tu archivo pom.xml, cambia el alcance (scope) de la dependencia H2 de "test" a "runtime":

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>2.1.214</version>
    <scope>runtime</scope>
</dependency>

Esto asegurará que la dependencia esté disponible en tiempo de ejecución y no solo durante las pruebas.

Puedes probar agregando la dependencia de Hibernate JPA a tu archivo pom.xml. Esto puede ayudar a resolver cualquier problema relacionado con el proveedor de persistencia:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.6.14.Final</version>
</dependency>

Asegúrate de que todas tus entidades estén correctamente anotadas con @Entity y que estén incluidas en el archivo persistence.xml o sean detectadas automáticamente por el escaneo del classpath. Para agregar las entidades manualmente, puedes agregar las siguientes líneas dentro de la etiqueta en tu archivo persistence.xml:

<class>com.latam.alura.tienda.modelo.TuEntidad1</class>
<class>com.latam.alura.tienda.modelo.TuEntidad2</class>
...

Reemplaza TuEntidad1, TuEntidad2, etc. con los nombres reales de tus clases de entidad.

Si ninguna de las sugerencias anteriores funciona, puedes intentar eliminar el directorio target de tu proyecto y luego volver a compilar y ejecutar tu proyecto. A veces, los archivos residuales en el directorio target pueden causar problemas inesperados. Espero que alguna de estas sugerencias te ayude a resolver el problema.

Felipe continuó igual, entonces relacione las clases asi:

<persistence-unit name="store" transaction-type="RESOURCE_LOCAL">
        <class>com.latam.alura.tienda.modelo.Producto</class>
        <class>com.latam.alura.tienda.modelo.Categoria</class>
        <class>com.latam.alura.tienda.modelo.Cliente</class>
        <class>com.latam.alura.tienda.modelo.ItemsPedido</class>
        <class>com.latam.alura.tienda.modelo.Pedido</class>
        <properties>
            <property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:E:\Captures\Oracle\9_Java y JPA consultas avanzadas, rendimiento y modelos complejos\H2_files\store"/>
            <property name="jakarta.persistence.jdbc.user" value="Joe"/>
            <property name="jakarta.persistence.jdbc.password" value="1234"/>

            <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="create-drop"/>

        </properties>

    </persistence-unit>

Y resulta que me da este error en buildtime -> Description Resource Path Location Type Class "com.latam.alura.tienda.modelo.Categoria" is listed in the persistence.xml file, but is not annotated Categoria.java /tienda (JPA-Curso 2)/src/main/java/com/latam/alura/tienda/modelo line 11 JPA Problem

pero las clases ya tienen anotaciones tal cual lo hizo el instructor

El error que mencionas indica que la clase "com.latam.alura.tienda.modelo.Categoria" está listada en el archivo persistence.xml, pero no está anotada. Esto significa que, aunque la clase está en el archivo de configuración, JPA no la reconoce como una entidad válida debido a la falta de anotaciones.

Comprueba que la clase Categoria tenga la anotación @Entity al comienzo de la definición de la clase, como se muestra a continuación:

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Categoria {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nombre;

    // Getters y setters, y cualquier otro método que necesites

Asegúrate de importar la anotación Entity y las demás anotaciones de JPA de jakarta.persistence, en lugar de javax.persistence, ya que mencionaste que estás utilizando Jakarta Persistence en lugar de Java Persistence API.

Si después de verificar y corregir las anotaciones en la clase Categoria, todavía experimentas problemas, asegúrate de que todas las demás clases enumeradas en el archivo persistence.xml también estén anotadas correctamente.

Además, si estás utilizando un IDE como Eclipse, IntelliJ IDEA o NetBeans, asegúrate de que el proyecto esté configurado para usar la versión correcta de Java y que las dependencias estén actualizadas. Puedes hacerlo ejecutando un comando de construcción de Maven (mvn clean install) o Gradle (./gradlew clean build) en la línea de comandos o utilizando las opciones de construcción y actualización en tu IDE.

solución!

Pues me doy, Pero ya realice conexión con Postgres y MySql con exito, así que continuaré con una de estas dos, espero full compatibilidad.

Conclusión: H2 want me away o no está funcionando correctamente.