Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.
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();