JPA (Java Persistence)

Contactar con el profesor

Es una especificación standard de la industria del desarrollo con Java para manipular una base de datos relacional utilizando la programación orientada a objetos como aproximación.

Al ser una especificación, por sí sola no puede manipular la base de datos. Es un conjunto de interfaces que deben ser implementadas.

¿Por qué usamos JPA, si es casi idéntico a Hibernate?

La razón tiene un contexto histórico. Primero estaban los EJB para hacer operaciones contra la base de datos. Pero consumían mucha memoria y eran complejos de programar. Le gente comenzó a pasarse a Hibernate para hacer operaciones contra la base de datos. Hibernate no era la solución oficial, pero se convirtió en un standard del mercado.

Lo que hizo Sun Microsystems (propietarios de Java en aquel entonces) fue desarrollar una solución oficial (JPA) que era una interfaz y que en el 99.9% de los casos implementa Hibernate, aunque podría implementar cualquier otra cosa.

Cómo configurar JPA

Main.java
public class Main {
    public static void main(String[] args){
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("TEST_PERSISTENCE_JPA");
        EntityManager em = emf.createEntityManager();
      
        Customer customer=new Customer("Pablo", "Monteserín");        
        Address address=new Address("Calle Falsa 123");
        customer.setAddress(address);
        
        try {
            em.getTransaction().begin();
            em.persist(customer);
            em.getTransaction().commit();

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            em.close();
        }
    }
}
src/main/resources/META-INF/persistence.xml
<?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="TEST_PERSISTENCE_JPA"
		transaction-type="RESOURCE_LOCAL">
	
		<properties>
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/prueba-jpa?serverTimezone=UTC" />
			<property name="javax.persistence.jdbc.user" value="pm" />
			<property name="javax.persistence.jdbc.password" value="pp" />

			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect" />

			<!-- hace cambios -->
			<property name="hibernate.hbm2ddl.auto" value="update" />

			<!-- si los cambios los fastidian todo, no hace cambios -->
			<!-- <property name="hibernate.hbm2ddl.auto" value="validate" /> -->

			<!-- <property name="hibernate.hbm2ddl.auto" value="create-drop" /> -->
			<property name="show_sql" value="true" />
		</properties>
	</persistence-unit>
</persistence>
./pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.pablo.clase</groupId>
    <artifactId>solo-jpa</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <hibernate.version>5.4.2.Final</hibernate.version>
        <spring.version>5.1.7.RELEASE</spring.version>
        <jstl.version>1.2</jstl.version>
        <servletapi.version>4.0.1</servletapi.version>
    </properties>

<dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate.version}</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.16</version>
    </dependency>
</dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Otras operaciones

Consulta de un solo objeto

TypedQuery<Usuario> query = em.createQuery("SELECT u from Usuario u WHERE u.nombre=:name AND u.pass=:password", Usuario.class);
query.setParameter("name", nombre);
query.setParameter("password", password);

Update

em.merge(usuario);

Remove

Invitado invitado = em.find(Invitado.class, id);
em.remove(invitado);
em.remove(em.contains(invitado) ? invitado : em.merge(invitado));

Consulta de un listado de objetos

Query query = em.createQuery("SELECT c from Customer");
List<Customer> result=query.getResultList();
← Eventos en Hibernate
Estructura de un proyecto usando DAO →

Aviso Legal | Política de privacidad