JPA Hibernate: FIN
This commit is contained in:
parent
28791262a7
commit
b968bcdb07
@ -7,3 +7,5 @@ Java y [bases de datos](./base_de_datos.md)
|
|||||||
- Lectura [JDBC](https://www.aluracursos.com/blog/conociendo-el-jdbc)
|
- Lectura [JDBC](https://www.aluracursos.com/blog/conociendo-el-jdbc)
|
||||||
- [Curso](https://app.aluracursos.com/course/java-jdbc-trabajando-base-datos)
|
- [Curso](https://app.aluracursos.com/course/java-jdbc-trabajando-base-datos)
|
||||||
Java y [JDBC](./jdbc.md)
|
Java y [JDBC](./jdbc.md)
|
||||||
|
- [Curso](https://app.aluracursos.com/course/persistencia-jpa-hibernate)
|
||||||
|
Persistencia con [JPA - Hibernate](./jpa_persistencia_hibernate.md)
|
||||||
|
@ -11,7 +11,7 @@ public class CategoriaController {
|
|||||||
private CategoriaDAO categoriaDAO;
|
private CategoriaDAO categoriaDAO;
|
||||||
|
|
||||||
public CategoriaController() {
|
public CategoriaController() {
|
||||||
var factory = new ConnectionFactory();
|
ConnectionFactory factory = new ConnectionFactory();
|
||||||
this.categoriaDAO = new CategoriaDAO(factory.recuperaConexion());
|
this.categoriaDAO = new CategoriaDAO(factory.recuperaConexion());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,8 +8,9 @@ import com.alura.jdbc.factory.ConnectionFactory;
|
|||||||
public class PruebaConexion {
|
public class PruebaConexion {
|
||||||
|
|
||||||
public static void main(String[] args) throws SQLException {
|
public static void main(String[] args) throws SQLException {
|
||||||
|
System.out.println("Intentando conexión con Connetion Factory");
|
||||||
Connection con = new ConnectionFactory().recuperaConexion();
|
Connection con = new ConnectionFactory().recuperaConexion();
|
||||||
System.out.println("Cerrando conexión");
|
System.out.println("Prueba OK, cerrando conexión");
|
||||||
con.close();
|
con.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,10 +15,10 @@ public class PruebaConexion {
|
|||||||
private final static String dbpass = "alura";
|
private final static String dbpass = "alura";
|
||||||
|
|
||||||
public static void main(String[] args) throws SQLException {
|
public static void main(String[] args) throws SQLException {
|
||||||
System.out.println("hola");
|
System.out.println("Intentando conexión con DB");
|
||||||
Connection con = DriverManager.getConnection(dburl, dbuser, dbpass);
|
Connection con = DriverManager.getConnection(dburl, dbuser, dbpass);
|
||||||
con.close();
|
con.close();
|
||||||
System.out.println("chao");
|
System.out.println("Prueba OK, conexión cerrada");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
45
010_spring_boot/jpa/tienda/pom.xml
Normal file
45
010_spring_boot/jpa/tienda/pom.xml
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<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.11.0</version>
|
||||||
|
<configuration>
|
||||||
|
<source>${java.version}</source>
|
||||||
|
<target>${java.version}</target>
|
||||||
|
<optimize>true</optimize>
|
||||||
|
<encoding>UTF-8</encoding>
|
||||||
|
<release>${java.version}</release>
|
||||||
|
<fork>true</fork>
|
||||||
|
<executable>/usr/bin/java</executable>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hibernate</groupId>
|
||||||
|
<artifactId>hibernate-entitymanager</artifactId>
|
||||||
|
<version>5.6.15.Final</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.h2database</groupId>
|
||||||
|
<artifactId>h2</artifactId>
|
||||||
|
<version>2.2.222</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<properties>
|
||||||
|
<java.version>17</java.version>
|
||||||
|
<maven.compiler.source>${java.version}</maven.compiler.source>
|
||||||
|
<maven.compiler.target>${java.version}</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
</project>
|
@ -0,0 +1,38 @@
|
|||||||
|
package com.latam.alura.tienda.dao;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
|
||||||
|
import com.latam.alura.tienda.modelo.Categoria;
|
||||||
|
|
||||||
|
public class CategoriaDao {
|
||||||
|
|
||||||
|
private EntityManager em;
|
||||||
|
|
||||||
|
public CategoriaDao(EntityManager em) {
|
||||||
|
this.em = em;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void guardar(Categoria categoria) {
|
||||||
|
this.em.persist(categoria);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void actualizar(Categoria categoria) {
|
||||||
|
this.em.merge(categoria);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void remover(Categoria categoria) {
|
||||||
|
categoria = this.em.merge(categoria);
|
||||||
|
this.em.remove(categoria);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Categoria consultaPorId(Long id) {
|
||||||
|
return em.find(Categoria.class, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Categoria> consultarTodos() {
|
||||||
|
String jpql = "SELECT P FROM Categoria AS P";
|
||||||
|
return em.createQuery(jpql, Categoria.class).getResultList();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
package com.latam.alura.tienda.dao;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
|
||||||
|
import com.latam.alura.tienda.modelo.Producto;
|
||||||
|
|
||||||
|
public class ProductoDao {
|
||||||
|
|
||||||
|
private EntityManager em;
|
||||||
|
|
||||||
|
public ProductoDao(EntityManager em) {
|
||||||
|
this.em = em;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void guardar(Producto producto) {
|
||||||
|
this.em.persist(producto);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void actualizar(Producto producto) {
|
||||||
|
this.em.merge(producto);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void remover(Producto producto) {
|
||||||
|
producto = this.em.merge(producto);
|
||||||
|
this.em.remove(producto);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Producto consultaPorId(Long id) {
|
||||||
|
return em.find(Producto.class, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Producto> consultarTodos() {
|
||||||
|
String jpql = "SELECT P FROM Producto AS P";
|
||||||
|
return em.createQuery(jpql, Producto.class).getResultList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Producto> consultaPorNombre(String nombre) {
|
||||||
|
String jpql = "SELECT P FROM Producto AS P WHERE P.nombre=:nombre";
|
||||||
|
return em.createQuery(jpql, Producto.class).setParameter("nombre", nombre).getResultList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Producto> consultaPorNombreDeCategoria(String nombre) {
|
||||||
|
String jpql = "SELECT P FROM Producto AS P WHERE P.categoria.nombre=:nombre";
|
||||||
|
return em.createQuery(jpql, Producto.class).setParameter("nombre", nombre).getResultList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal consultaPrecioPorNombreDeProducto(String nombre) {
|
||||||
|
String jpql = "SELECT P.precio FROM Producto AS P WHERE P.nombre=:nombre";
|
||||||
|
return em.createQuery(jpql, BigDecimal.class).setParameter("nombre", nombre).getSingleResult();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
package com.latam.alura.tienda.modelo;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.GenerationType;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
//public enum Categoria {
|
||||||
|
// SOFTWARES,
|
||||||
|
// LIBROS,
|
||||||
|
// CELULARES
|
||||||
|
//}
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name="categorias")
|
||||||
|
public class Categoria {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
private String nombre;
|
||||||
|
|
||||||
|
public Categoria() {}
|
||||||
|
|
||||||
|
public Categoria(String nombre) {
|
||||||
|
this.nombre = nombre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNombre() {
|
||||||
|
return nombre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNombre(String nombre) {
|
||||||
|
this.nombre = nombre;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,75 @@
|
|||||||
|
package com.latam.alura.tienda.modelo;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
//import javax.persistence.EnumType;
|
||||||
|
//import javax.persistence.Enumerated;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.GenerationType;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.ManyToOne;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name="productos")
|
||||||
|
public class Producto {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy=GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
// @Column(name="nombres")
|
||||||
|
private String nombre;
|
||||||
|
private String descripcion;
|
||||||
|
private BigDecimal precio;
|
||||||
|
private LocalDate fechaDeRegistro = LocalDate.now();
|
||||||
|
//@Enumerated(EnumType.STRING)
|
||||||
|
@ManyToOne
|
||||||
|
private Categoria categoria;
|
||||||
|
|
||||||
|
public Producto() {}
|
||||||
|
|
||||||
|
public Producto(String nombre, String descripcion, BigDecimal precio, Categoria categoria) {
|
||||||
|
this.nombre = nombre;
|
||||||
|
this.descripcion = descripcion;
|
||||||
|
this.precio = precio;
|
||||||
|
this.categoria = categoria;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNombre() {
|
||||||
|
return nombre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNombre(String nombre) {
|
||||||
|
this.nombre = nombre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescripcion() {
|
||||||
|
return descripcion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescripcion(String descripcion) {
|
||||||
|
this.descripcion = descripcion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getPrecio() {
|
||||||
|
return precio;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPrecio(BigDecimal precio) {
|
||||||
|
this.precio = precio;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDate getFechaDeRegistro() {
|
||||||
|
return fechaDeRegistro;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,121 @@
|
|||||||
|
package com.latam.alura.tienda.prueba;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
//import javax.persistence.EntityManagerFactory;
|
||||||
|
//import javax.persistence.Persistence;
|
||||||
|
|
||||||
|
import com.latam.alura.tienda.dao.CategoriaDao;
|
||||||
|
import com.latam.alura.tienda.dao.ProductoDao;
|
||||||
|
import com.latam.alura.tienda.modelo.Categoria;
|
||||||
|
import com.latam.alura.tienda.modelo.Producto;
|
||||||
|
import com.latam.alura.tienda.utils.JPAUtils;
|
||||||
|
|
||||||
|
public class RegistroDeProducto {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
RegistrarProducto();
|
||||||
|
EntityManager em = JPAUtils.getEntityManager();
|
||||||
|
ProductoDao productoDao = new ProductoDao(em);
|
||||||
|
Producto producto = productoDao.consultaPorId(1L);
|
||||||
|
System.out.println(producto.getNombre());
|
||||||
|
|
||||||
|
List<Producto> productos = productoDao.consultarTodos();
|
||||||
|
productos.forEach(producto_ -> System.out.println(producto_.getDescripcion()));
|
||||||
|
|
||||||
|
CategoriaDao categoriaDao = new CategoriaDao(em);
|
||||||
|
List<Categoria> categorias = categoriaDao.consultarTodos();
|
||||||
|
categorias.forEach(categoria_ -> System.out.println(categoria_.getNombre()));
|
||||||
|
|
||||||
|
List<Producto> productos_por_nombre = productoDao.consultaPorNombre("Samsung");
|
||||||
|
productos_por_nombre.forEach(producto_ -> System.out.println(producto_.getDescripcion()));
|
||||||
|
|
||||||
|
List<Producto> productos_por_nombre_categoria = productoDao.consultaPorNombreDeCategoria("Celulares");
|
||||||
|
productos_por_nombre_categoria.forEach(producto_ -> System.out.println(producto_.getDescripcion()));
|
||||||
|
|
||||||
|
BigDecimal precio_producto = productoDao.consultaPrecioPorNombreDeProducto("Samsung");
|
||||||
|
System.out.println(precio_producto);
|
||||||
|
/*
|
||||||
|
Categoria celulares = new Categoria("Celulares");
|
||||||
|
//Producto celular = new Producto("Samsung", "Teléfono usado", new BigDecimal("1000"), Categoria.CELULARES);
|
||||||
|
Producto celular = new Producto("Samsung", "Teléfono usado", new BigDecimal("1000"), celulares);
|
||||||
|
//celular.setNombre("Samsung");
|
||||||
|
//celular.setDescripcion("Teléfono usado");
|
||||||
|
//celular.setPrecio(new BigDecimal("1000"));
|
||||||
|
|
||||||
|
//EntityManagerFactory factory = Persistence.createEntityManagerFactory("tienda");
|
||||||
|
//EntityManager em = factory.createEntityManager();
|
||||||
|
EntityManager em = JPAUtils.getEntityManager();
|
||||||
|
|
||||||
|
ProductoDao productoDao = new ProductoDao(em);
|
||||||
|
CategoriaDao categoriaDao = new CategoriaDao(em);
|
||||||
|
|
||||||
|
em.getTransaction().begin();
|
||||||
|
categoriaDao.guardar(celulares);
|
||||||
|
productoDao.guardar(celular);
|
||||||
|
//em.persist(celular);
|
||||||
|
//em.getTransaction().commit();
|
||||||
|
em.flush();
|
||||||
|
em.clear();
|
||||||
|
//em.close();
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Acciones por aula
|
||||||
|
//em.getTransaction().begin();
|
||||||
|
|
||||||
|
//V1
|
||||||
|
/*
|
||||||
|
em.getTransaction().begin();
|
||||||
|
em.persist(celulares);
|
||||||
|
celulares.setNombre("LAPTOPS");
|
||||||
|
em.getTransaction().commit();
|
||||||
|
em.close();
|
||||||
|
celulares.setNombre("PANTALLAS");
|
||||||
|
*/
|
||||||
|
|
||||||
|
//V2
|
||||||
|
/*
|
||||||
|
em.persist(celulares);
|
||||||
|
celulares.setNombre("LAPTOPS");
|
||||||
|
em.flush();
|
||||||
|
em.clear();
|
||||||
|
|
||||||
|
celulares = em.merge(celulares);
|
||||||
|
celulares.setNombre("PANTALLAS");
|
||||||
|
em.flush();
|
||||||
|
em.remove(celulares);
|
||||||
|
*/
|
||||||
|
|
||||||
|
//V3
|
||||||
|
/*
|
||||||
|
em.persist(celulares);
|
||||||
|
celulares.setNombre("LAPTOPS");
|
||||||
|
em.flush();
|
||||||
|
em.clear();
|
||||||
|
|
||||||
|
celulares = em.merge(celulares);
|
||||||
|
celulares.setNombre("PANTALLAS");
|
||||||
|
em.flush();
|
||||||
|
//em.clear();
|
||||||
|
em.remove(celulares);
|
||||||
|
em.flush();
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RegistrarProducto() {
|
||||||
|
Categoria celulares = new Categoria("Celulares");
|
||||||
|
Producto celular = new Producto("Samsung", "Teléfono usado", new BigDecimal("1000"), celulares);
|
||||||
|
EntityManager em = JPAUtils.getEntityManager();
|
||||||
|
ProductoDao productoDao = new ProductoDao(em);
|
||||||
|
CategoriaDao categoriaDao = new CategoriaDao(em);
|
||||||
|
|
||||||
|
em.getTransaction().begin();
|
||||||
|
categoriaDao.guardar(celulares);
|
||||||
|
productoDao.guardar(celular);
|
||||||
|
em.getTransaction().commit();
|
||||||
|
em.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.latam.alura.tienda.utils;
|
||||||
|
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
import javax.persistence.EntityManagerFactory;
|
||||||
|
import javax.persistence.Persistence;
|
||||||
|
|
||||||
|
public class JPAUtils {
|
||||||
|
|
||||||
|
private static EntityManagerFactory FACTORY = Persistence.createEntityManagerFactory("tienda");
|
||||||
|
|
||||||
|
public static EntityManager getEntityManager() {
|
||||||
|
return FACTORY.createEntityManager();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
<?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="tienda" transaction-type="RESOURCE_LOCAL">
|
||||||
|
<!-- En caso de utilizar otro framework distinto de Hibernate
|
||||||
|
se deben especificar las entidades
|
||||||
|
<class>com.latam.alura.tienda.modelo.Producto</class>
|
||||||
|
-->
|
||||||
|
<properties>
|
||||||
|
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
|
||||||
|
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:tienda;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false"/>
|
||||||
|
<property name="javax.persistence.jdbc.user" value="sa"/>
|
||||||
|
<property name="javax.persistence.jdbc.password" value=""/>
|
||||||
|
<property name="hibernate.show_sql" value="true"/>
|
||||||
|
<property name="hibernate.format_sql" value="true"/>
|
||||||
|
<property name="hibernate.hbm2ddl.auto" value="update"/>
|
||||||
|
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
|
||||||
|
<!-- hibernate.hdbm2ddl.auto values:
|
||||||
|
- create: Crea tabla, columnas y datos, de manera persistente
|
||||||
|
- create-drop: Igual que create, pero elimina todo al terminar la applicación.
|
||||||
|
- validate: Verifica que todo esté correcto
|
||||||
|
- update: Crea en caso de que no existan elementos, tablas o datos. Persistente
|
||||||
|
-->
|
||||||
|
</properties>
|
||||||
|
</persistence-unit>
|
||||||
|
</persistence>
|
264
010_spring_boot/jpa_persistencia_hibernate.md
Normal file
264
010_spring_boot/jpa_persistencia_hibernate.md
Normal file
@ -0,0 +1,264 @@
|
|||||||
|
# JPA
|
||||||
|
|
||||||
|
<style>div.mermaid{text-align: center;}</style>
|
||||||
|
|
||||||
|
## Java Persistence API
|
||||||
|
|
||||||
|
[H2 Database Engine](https://mvnrepository.com/artifact/com.h2database/h2/2.2.222)
|
||||||
|
|
||||||
|
### JDBC
|
||||||
|
|
||||||
|
- Especificación para acceso al banco de datos relacional JAVA
|
||||||
|
- Abstracción del protocolo de comunicación con BD
|
||||||
|
- Drivers de la BD son implementaciones de JDBC
|
||||||
|
- Impacto mínimo en la aplicación al cambiar de BD
|
||||||
|
- Pattern DAO ayuda a aislar el código entre la API y el JDBC
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%%{init: {'theme': 'dark','themeVariables': {'clusterBkg': '#2b2f38'}, 'flowchart': {'curve': 'monotoneY'}}}%%
|
||||||
|
flowchart
|
||||||
|
subgraph JDBC
|
||||||
|
DB[(Base de Datos)]
|
||||||
|
CS("Controller/Service
|
||||||
|
(Lógica de Negocios)")
|
||||||
|
style CS fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||||
|
DAO("DAO
|
||||||
|
(JDBC)")
|
||||||
|
style DAO fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||||
|
CS-->DAO-->DB
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Ejemplo
|
||||||
|
|
||||||
|
```java
|
||||||
|
public class RegistroDeProductoService {
|
||||||
|
private ProductoDao dao;
|
||||||
|
|
||||||
|
public RegistroDeProductoService(ProductoDao dao) {
|
||||||
|
this.dao = dao;
|
||||||
|
}
|
||||||
|
public void registrarProducto(Producto producto) {
|
||||||
|
// lógica de negocio
|
||||||
|
this.dao.registrar(producto);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Desventajas de JDBC
|
||||||
|
|
||||||
|
- Demasiado detalle, muchas lineas de código
|
||||||
|
- Alto acoplamiento con la BD, cualquier cambio en una parte tiene alto impacto
|
||||||
|
en otra parte
|
||||||
|
|
||||||
|
### Hibernate
|
||||||
|
|
||||||
|
- Creado en el año 2001 por ***Gavin King***
|
||||||
|
- Alternativa a JDBC/EJB 2
|
||||||
|
- Posteriormente Gavin King fue contratado por Red Hat
|
||||||
|
|
||||||
|
### JPA
|
||||||
|
|
||||||
|
- Especificación para ORM (Object Relational Mapping) en JAVA
|
||||||
|
- Lanzada el 2006
|
||||||
|
- Versión 2.0 lanzada el 2009
|
||||||
|
- Hibernate 3.5.0 (2010) paso a soportar JPA 2
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%%{init: {'theme': 'dark','themeVariables': {'clusterBkg': '#2b2f38'}, 'flowchart': {'curve': 'monotoneY'}}}%%
|
||||||
|
flowchart
|
||||||
|
subgraph " "
|
||||||
|
direction BT
|
||||||
|
JP(JPA)
|
||||||
|
HB(Hibernate)
|
||||||
|
style HB fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||||
|
EL(EclipseLink)
|
||||||
|
style EL fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||||
|
OJP(OpenJPA)
|
||||||
|
style OJP fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||||
|
HB-->JP
|
||||||
|
EL-->JP
|
||||||
|
OJP-->JP
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
JPA es una capa (una abstarcción) se debe usar una biblioteca que la implemente
|
||||||
|
Existen detalles específicos de Hibernate que dificultan cambiar de implementacion
|
||||||
|
de JPA. Es recomendable mantenerse dentro del patrón de JPA.
|
||||||
|
|
||||||
|
EclipseLink es la implementación de referencia de JPA.
|
||||||
|
|
||||||
|
pom.xml
|
||||||
|
|
||||||
|
```xml
|
||||||
|
...
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.11.0</version>
|
||||||
|
<configuration>
|
||||||
|
<source>${java.version}</source>
|
||||||
|
<target>${java.version}</target>
|
||||||
|
<optimize>true</optimize>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hibernate</groupId>
|
||||||
|
<artifactId>hibernate-entitymanager</artifactId>
|
||||||
|
<version>5.6.15.Final</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.h2database</groupId>
|
||||||
|
<artifactId>h2</artifactId>
|
||||||
|
<version>2.2.222</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
[/tienda/src/main/resources/META-INF/persistence.xml](./jpa/tienda/src/main/resources/META-INF/persistence.xml)
|
||||||
|
|
||||||
|
```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="tienda" transaction-type="RESOURCE_LOCAL">
|
||||||
|
<properties>
|
||||||
|
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
|
||||||
|
<property name="javax.persistence.jdbc.url" value="jpdc:h2:mem:tienda"/>
|
||||||
|
<property name="javax.persistence.jdbc.user" value="sa"/>
|
||||||
|
<property name="javax.persistence.jdbc.password" value=""/>
|
||||||
|
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
|
||||||
|
</properties>
|
||||||
|
</persistence-unit>
|
||||||
|
</persistence>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Mapeo de entidades
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%%{init: {'theme': 'dark','themeVariables': {'clusterBkg': '#2b2f38'}, 'flowchart': {'curve': 'monotoneY'}}}%%
|
||||||
|
flowchart
|
||||||
|
subgraph " "
|
||||||
|
DB[(Base de Datos)]
|
||||||
|
EN(Entidades)
|
||||||
|
style EN fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||||
|
subgraph ORM
|
||||||
|
OR("Tablas == Clases
|
||||||
|
Columnas == Atributos
|
||||||
|
Filas == Objetos")
|
||||||
|
style ORM fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||||
|
end
|
||||||
|
ORM-->EN-->DB
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Entidades
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
erDiagram
|
||||||
|
Productos }|--|| Categorias : tiene
|
||||||
|
Productos {
|
||||||
|
id bigint PK
|
||||||
|
Nombre varchar
|
||||||
|
Descripcion varchar
|
||||||
|
Precio decimal
|
||||||
|
categoria_id int FK
|
||||||
|
}
|
||||||
|
Categorias {
|
||||||
|
id biging PK
|
||||||
|
nombre string
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ciclo de vida de una entidad en JPA
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
%%{init: {'theme': 'dark','themeVariables': {'clusterBkg': '#2b2f38'}, 'flowchart': {'curve': 'linear'}}}%%
|
||||||
|
flowchart
|
||||||
|
subgraph " "
|
||||||
|
NO["operador
|
||||||
|
new"]
|
||||||
|
TR(tranciente)
|
||||||
|
NO-->TR
|
||||||
|
MG(Managed)
|
||||||
|
TR-->MG
|
||||||
|
subgraph " "
|
||||||
|
RM(removed)
|
||||||
|
DT(detached)
|
||||||
|
MG<-->RM
|
||||||
|
MG<--"close, clear
|
||||||
|
detach"-->DT
|
||||||
|
end
|
||||||
|
direction TB
|
||||||
|
DB[(Base de Datos)]
|
||||||
|
MG--"flush,
|
||||||
|
commit"-->DB
|
||||||
|
DB--"find,
|
||||||
|
query"-->MG
|
||||||
|
end
|
||||||
|
style DT fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||||
|
style RM fill:#3f3f3f,stroke:#000,stroke-width:2px
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Estados de una Transacción
|
||||||
|
|
||||||
|
- Transiente
|
||||||
|
- Managed
|
||||||
|
**flush()**: permite realizar un rollback.
|
||||||
|
**commit()**: los cambios son definitivos.
|
||||||
|
**close()**: cierra el ***EntityManager***.
|
||||||
|
**clear()**: envia todas las entidades a un estado ***detach*** (ahorro de memoria).
|
||||||
|
**merge()**: actualiza un registro (primero realiza un select, luego se debe
|
||||||
|
asignar para su posterior merge, trae un registro al estado *Managed*).
|
||||||
|
**remove()**: delete registro si tiene estado *managed*.
|
||||||
|
- Detached
|
||||||
|
- Removed
|
||||||
|
|
||||||
|
### Consultas JPA
|
||||||
|
|
||||||
|
[ProductoDao.java](./jpa/tienda/src/main/java/com/latam/alura/tienda/dao/ProductoDao.java)
|
||||||
|
|
||||||
|
```java
|
||||||
|
...
|
||||||
|
public Producto consultaPorId(Long id) {
|
||||||
|
return em.find(Producto.class, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Producto> consultarTodos() {
|
||||||
|
String jpql = "SELECT P FROM Producto AS P";
|
||||||
|
return em.createQuery(jpql, Producto.class).getResultList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Producto> consultaPorNombre(String nombre) {
|
||||||
|
String jpql = "SELECT P FROM Producto AS P WHERE P.nombre=:nombre";
|
||||||
|
return em.createQuery(jpql, Producto.class).setParameter("nombre", nombre).getResultList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Producto> consultaPorNombreDeCategoria(String nombre) {
|
||||||
|
String jpql = "SELECT P FROM Producto AS P WHERE P.categoria.nombre=:nombre";
|
||||||
|
return em.createQuery(jpql, Producto.class).setParameter("nombre", nombre).getResultList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal consultaPrecioPorNombreDeProducto(String nombre) {
|
||||||
|
String jpql = "SELECT P.precio FROM Producto AS P WHERE P.nombre=:nombre";
|
||||||
|
return em.createQuery(jpql, BigDecimal.class).setParameter("nombre", nombre).getSingleResult();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
Archivos de configuración:
|
||||||
|
|
||||||
|
- [pom.xml](./jpa/tienda/pom.xml)
|
||||||
|
- [presistence.xml](./jpa/tienda/src/main/resources/META-INF/persistence.xml)
|
@ -47,3 +47,5 @@ primoridiales en programación con Javascript
|
|||||||
- [Emprendimiento](./009_emprendimiento/)
|
- [Emprendimiento](./009_emprendimiento/)
|
||||||
- [Spring Boot](./010_spring_boot/README.md)
|
- [Spring Boot](./010_spring_boot/README.md)
|
||||||
- [Base de datos](./010_spring_boot/base_de_datos.md)
|
- [Base de datos](./010_spring_boot/base_de_datos.md)
|
||||||
|
- [JDBC](./010_spring_boot/jdbc.md)
|
||||||
|
- [Persistencia con JPA - Hibernate](./010_spring_boot/jpa_persistencia_hibernate.md)
|
||||||
|
Loading…
Reference in New Issue
Block a user