Persistencia de datos con Spring Data JPA
En casi todas las aplicaciones necesitamos guardar datos en una base de datos.
Spring Boot facilita mucho esta tarea gracias a:
Spring Data JPA
Con esto podremos:
- guardar datos
- consultar datos
- actualizar datos
- eliminar datos
sin escribir mucho código SQL.
1. Qué es JPA #
JPA significa:
Java Persistence API
Es una especificación de Java para trabajar con bases de datos usando objetos.
En lugar de escribir SQL directamente, usamos clases Java.
Ejemplo:
Tabla en base de datos:
1users
Clase Java equivalente:
1@Entity 2public class User { 3 4 private Long id; 5 private String name; 6 7}
2. Qué es Hibernate #
JPA es solo una especificación.
La implementación más usada es:
Hibernate
Spring Boot usa Hibernate automáticamente cuando usamos JPA.
3. Añadir dependencia JPA #
En pom.xml añadimos:
1<dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-data-jpa</artifactId> 4</dependency>
También necesitamos el driver de la base de datos.
Ejemplo para PostgreSQL:
1<dependency> 2 <groupId>org.postgresql</groupId> 3 <artifactId>postgresql</artifactId> 4</dependency>
4. Configurar la base de datos #
Configuración en:
application.properties
Ejemplo:
1spring.datasource.url=jdbc:postgresql://localhost:5432/mydb 2spring.datasource.username=postgres 3spring.datasource.password=1234 4 5spring.jpa.hibernate.ddl-auto=update 6spring.jpa.show-sql=true
5. Explicación #
| propiedad | función |
|---|---|
| spring.datasource.url | conexión a base de datos |
| spring.datasource.username | usuario |
| spring.datasource.password | contraseña |
| spring.jpa.hibernate.ddl-auto | crea o actualiza tablas |
| spring.jpa.show-sql | muestra SQL en consola |
6. Crear una Entity #
Una Entity representa una tabla.
7. Ejemplo #
1@Entity 2public class User { 3 4 @Id 5 @GeneratedValue 6 private Long id; 7 8 private String name; 9 10 private String email; 11 12}
8. Anotaciones importantes #
| anotación | función |
|---|---|
@Entity | indica que es una tabla |
@Id | clave primaria |
@GeneratedValue | genera ID automáticamente |
9. Crear un Repository #
Un repository permite acceder a la base de datos.
Spring Boot puede generar automáticamente el código.
10. Ejemplo #
1@Repository 2public interface UserRepository extends JpaRepository<User, Long> { 3 4}
Esto ya crea automáticamente:
1save() 2findAll() 3findById() 4deleteById() 5count()
Sin escribir código.
11. Guardar datos #
Ejemplo en un service.
1@Service 2public class UserService { 3 4 private final UserRepository repository; 5 6 public UserService(UserRepository repository) { 7 this.repository = repository; 8 } 9 10 public User createUser(User user) { 11 return repository.save(user); 12 } 13 14}
12. Obtener datos #
Ejemplo:
1public List<User> getUsers() { 2 return repository.findAll(); 3}
13. Buscar por ID #
1public Optional<User> getUser(Long id) { 2 return repository.findById(id); 3}
Optional indica que el usuario puede existir o no.
14. Eliminar datos #
1public void deleteUser(Long id) { 2 repository.deleteById(id); 3}
15. Controller completo #
1@RestController 2@RequestMapping("/users") 3public class UserController { 4 5 private final UserService service; 6 7 public UserController(UserService service) { 8 this.service = service; 9 } 10 11 @GetMapping 12 public List<User> getUsers() { 13 return service.getUsers(); 14 } 15 16 @PostMapping 17 public User createUser(@RequestBody User user) { 18 return service.createUser(user); 19 } 20 21}
16. Crear consultas automáticas #
Spring Data JPA puede generar consultas a partir del nombre del método.
17. Ejemplo #
1List<User> findByName(String name);
Spring genera automáticamente:
1SELECT * FROM users WHERE name = ?
18. Más ejemplos #
1findByEmail(String email) 2 3findByNameAndEmail(String name, String email) 4 5findByNameContaining(String name)
19. Paginación #
Si hay muchos datos, conviene usar paginación.
Ejemplo:
1Page<User> findAll(Pageable pageable);
Uso:
1PageRequest.of(0, 10)
Esto devuelve 10 registros.
20. Relaciones entre entidades #
Las tablas suelen estar relacionadas.
Ejemplo:
users
orders
Un usuario puede tener muchos pedidos.
21. Ejemplo en JPA #
1@Entity 2public class User { 3 4 @Id 5 @GeneratedValue 6 private Long id; 7 8 private String name; 9 10 @OneToMany 11 private List<Order> orders; 12 13}
22. Tipos de relaciones #
| relación | anotación |
|---|---|
| uno a uno | @OneToOne |
| uno a muchos | @OneToMany |
| muchos a uno | @ManyToOne |
| muchos a muchos | @ManyToMany |
23. Ejemplo relación ManyToOne #
1@Entity 2public class Order { 3 4 @Id 5 @GeneratedValue 6 private Long id; 7 8 @ManyToOne 9 private User user; 10 11}
Un usuario puede tener muchos pedidos.
24. Qué hace Hibernate automáticamente #
Hibernate convierte las entidades en tablas.
Ejemplo:
Clase:
1@Entity 2class User
Tabla generada:
1users
Campos:
1id 2name 3email
Resumen del tema
Conceptos clave #
- JPA e Hibernate: Java Persistence API como especificación estándar ORM (Mapeo Objeto-Relacional) e Hibernate como motor de implementación por defecto.
- Mapeo de Entidades: anotaciones
@Entity,@Table,@Id,@GeneratedValue(strategy = GenerationType.IDENTITY)y mapeo de campos. - Repositorios de Spring Data JPA: interfaces que extienden
JpaRepository<T, ID>aportando métodos CRUD automáticos (save,findAll,findById,deleteById). - Métodos de Consulta Derivados (Query Methods): generación dinámica de SQL a partir de firmas semánticas de métodos (ej.
findByEmail,findByNameContainingIgnoreCase). - Relaciones entre Entidades:
@OneToOne,@OneToMany,@ManyToOne,@ManyToManycon gestión de clave foránea mediante@JoinColumn. - Paginación y Ordenación: soporte integrado pasando objetos
Pageable(PageRequest.of(page, size)) retornando estructurasPage<T>.
Qué debes recordar #
Spring Data JPA e Hibernate abstraen la base de datos mapeando clases @Entity en tablas y proporcionando operaciones CRUD y consultas declarativas sin escribir SQL manual.