-
Notifications
You must be signed in to change notification settings - Fork 3
09. Java Persistence API (JPA)
JPA (Java Persistence API) es una especificación estándar de Java para la programación de persistencia, basada en el paradigma ORM (Object Relational Mapping). Su objetivo es permitir que las aplicaciones interactúen con bases de datos utilizando objetos en lugar de escribir consultas SQL manualmente.
- JDBC requiere escribir consultas SQL directamente, lo que puede generar errores y aumentar la complejidad.
- JPA simplifica la persistencia de datos al mapear objetos Java a tablas de base de datos mediante anotaciones o XML.
- Permite trabajar con bases de datos sin depender de código SQL específico.
- Hibernate
- ObjectDB
- EclipseLink
- OpenJPA
- Usa EntityManager para manejar operaciones como insertar, actualizar y eliminar datos.
- Proporciona JPQL (Java Persistence Query Language) para realizar consultas sin necesidad de escribir SQL.
- Se encarga automáticamente de la conversión entre tipos Java y tipos SQL.
- Genera y ejecuta las consultas SQL necesarias internamente, evitando que el programador escriba código JDBC manual.
Note
JPA facilita la persistencia de objetos y permite que el desarrollo en Java mantenga la orientación a objetos sin perder eficiencia al trabajar con bases de datos.
JPA (Java Persistence API) está diseñada para gestionar entidades y sus relaciones en bases de datos. Sus principales componentes son:
- Entidad (@Entity): Clase Java que representa una fila en una tabla. Cada atributo mapea una columna.
-
Persistence: Clase que obtiene instancias de
EntityManagerFactory, el punto de entrada a la persistencia. -
EntityManagerFactory: Crea y gestiona
EntityManager, configurándose una sola vez en la aplicación. - EntityManager: Gestiona operaciones de persistencia (crear, leer, actualizar, eliminar) y consultas.
- Query: Interfaz para ejecutar consultas JPQL y obtener resultados.
- EntityTransaction: Maneja transacciones en la base de datos (inicio, confirmación, reversión).
JPA permite transformar objetos en tablas mediante ORM (Object-Relational Mapping), utilizando anotaciones:
| Anotación | Descripción |
|---|---|
@Entity |
Declara una clase como entidad mapeada a una tabla. |
@Table(name="tabla") |
Especifica el nombre de la tabla en la BD (opcional). |
@Id |
Indica la clave primaria. |
@GeneratedValue(strategy=GenerationType.IDENTITY) |
Genera automáticamente la clave primaria. |
@Column(name="columna", length=50, nullable=false, unique=true) |
Mapea un atributo con una columna, permitiendo configurar restricciones. |
@Enumerated(EnumType.STRING) |
Almacena un enum como STRING u ORDINAL. |
@Temporal(TemporalType.DATE) |
Define cómo se almacenan fechas (DATE, TIME, TIMESTAMP). |
public class Empleado {
private Long id;
private String nombre;
}No está vinculada a la base de datos.
@Entity
public class Empleado {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nombre;
}Ahora JPA la reconoce y la mapea a una tabla.
@Entity
public class Empleado {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nombre;
}-
@Id: Define la clave primaria. -
@GeneratedValue(strategy = GenerationType.IDENTITY): Delega la generación del ID a la base de datos (autoincrementable).
@Entity
public class Empleado {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nombre;
@Temporal(TemporalType.DATE) // Solo almacena la fecha
private Date fechaNacimiento;
}Opciones de @Temporal:
- DATE: Solo almacena la fecha.
- TIME: Solo almacena la hora.
- TIMESTAMP: Almacena fecha y hora.
En bases de datos relacionales, las tablas pueden estar relacionadas entre sí. JPA permite reflejar estas relaciones en el código mediante anotaciones.
| Anotación | Descripción |
|---|---|
@OneToOne |
Relación uno a uno. |
@OneToMany |
Relación uno a muchos. |
@ManyToOne |
Relación muchos a uno. |
@ManyToMany |
Relación muchos a muchos. |
Un curso tiene un único profesor, y un profesor pertenece a un solo curso:
@Entity
public class Curso {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
private Profesor profesor;
}📌 Base de datos: Se genera una tabla Curso con una clave foránea que apunta a Profesor.
Varios álbumes pueden pertenecer a un solo autor:
@Entity
public class Album {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
private Autor autor;
}📌 Base de datos: La tabla Album tendrá una columna que referencia a Autor.
Cada empleado puede tener varias tareas, y cada tarea puede asignarse a varios empleados:
@Entity
public class Empleado {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany
private List<Tarea> tareas;
}📌 Base de datos: Se requiere una tabla intermedia para gestionar la relación.
Como SQL no permite almacenar múltiples valores en una celda, se usa una tabla intermedia para gestionar relaciones muchos a muchos.
Ejemplo de estructura:
Tablas principales:
| Empleado | Tarea |
|---|---|
| ID, Nombre | ID, Nombre |
Tabla intermedia:
| ID_Empleado | ID_Tarea |
|---|---|
| 95 | 624 |
| 95 | 915 |
| 28 | 567 |
| 28 | 624 |
📌 Clave primaria compuesta: La tabla intermedia almacena solo los IDs de las entidades relacionadas.
CREATE DATABASE nomrebasededatos;Esto creará la base de datos vacía para el proyecto.
- Crear un proyecto Maven.
- Configura valores:
- groupId:
- artifactId:
Incluye las siguientes dependencias esenciales:
- Hibernate como ORM.
-
Jakarta Persistence API (
jakarta.persistence-api). -
MySQL Connector (
mysql-connector-j). - EclipseLink (opcional).
Ejecuta:
mvn clean installpara instalar las dependencias.
- Ubícalo dentro de src/main/resources/META-INF/.
- Configura la conexión a la base de datos:
<persistence-unit name="NombreBaseDeDatos" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/vivero2?serverTimezone=UTC"/>
<property name="jakarta.persistence.jdbc.user" value="root"/>
<property name="jakarta.persistence.jdbc.password" value="root"/>
<property name="jakarta.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="jakarta.persistence.schema-generation.database.action" value="update"/>
</properties>
</persistence-unit>- Crea un paquete entidades dentro de
com.egg. - Define una clase por cada tabla del modelo.
- Usa las anotaciones:
-
@Entitypara marcar la clase como entidad. -
@Table(name = "nombre_tabla")para mapearla con la base de datos. -
@Idy@GeneratedValuepara la clave primaria. -
@Column(name = "nombre_columna")para mapear atributos. -
@ManyToOne,@OneToManypara definir relaciones.
-