Descargar como pptx, pdf o txt
Descargar como pptx, pdf o txt
Está en la página 1de 119

Acceso a Datos – Tema 5.

Hibernate I
Mario Marugán Cancio
Objetivos
▪ Mapeo objeto-relacional sin sql

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 2


Contenido
▪ Bibliografía
1. Introducción
2. Tipos de ORM
3. Hibernate
4. Instalación
5. Creación de la Base de Datos
6. Creación de un proyecto en eclipse
7. Mapping a Hibernate
8. Anotaciones
9. HQL
10. Criteria
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 3
Bibliografía
▪ https://hibernate.org/

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 4


Contenido
▪ Bibliografía
1. Introducción
2. Tipos de ORM
3. Hibernate
4. Instalación
5. Creación de la Base de Datos
6. Creación de un proyecto en eclipse
7. Mapping a Hibernate
8. Anotaciones
9. HQL
10. Criteria
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 5
1. Introducción
▪ Técnica de programación para convertir datos entre el
sistema de tipos utilizado en un lenguaje de
programación orientado a objetos y la utilización de una
base de datos relacional como motor de persistencia.
▪ Permite ver y modificar los datos almacenados en una
base de datos relacional.
▪ Organiza las tablas o procedimientos almacenados en
clases, y en vez de utilizar consultas SQL, utiliza
métodos y propiedades.
▪ La característica más importante es el mapeo.

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 6


1. Introducción
▪ Ventajas:
▪ Gestiona de forma automática la conversión de tipos DATE y
TIME.
▪ Se encarga de hacer el trabajo pesado.
▪ Brinda seguridad previniendo ataques de inyección SQL.
▪ Desventajas:
▪ Se puede perder la noción del tiempo invertido en retocar
archivos XML.
▪ Un mal uso de las ORM’S, puede llevar a un mal
funcionamiento de la aplicación.

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 7


Contenido
▪ Bibliografía
1. Introducción
2. Tipos de ORM
3. Hibernate
4. Instalación
5. Creación de la Base de Datos
6. Creación de un proyecto en eclipse
7. Mapping a Hibernate
8. Anotaciones
9. HQL
10. Criteria
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 8
2. Tipos de ORM
▪ Java => Hibernate, iBatis, Ebean, etc..
▪ Hibernate: Facilita el mapeo de atributos entre una base
de datos relacional tradicional y el modelo de objetos de
una aplicación, mediante archivos declarativos (XML) o
anotaciones en los beans de las entidades que permiten
establecer estas relaciones.
▪ Hibernate es software libre, distribuido bajo los términos
de la licencia GNU LGPL.

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 9


2. Tipos de ORM
▪ .NET=> Entity Framework, nHibernate, etc..
▪ nHibernate: Es la conversión de Hibernate de lenguaje Java a C#
para su integración en la plataforma .NET. Al igual que muchas otras
herramientas libres para esta plataforma, NHibernate también
funciona en Mono.
▪ Al usar NHibernate para el acceso a datos el desarrollador se
asegura de que su aplicación es agnóstica en cuanto al motor de
base de datos a utilizar en producción, pues NHibernate soporta los
más habituales en el mercado: MySQL, PostgreSQL, Oracle, MS SQL
Server, etc. Sólo se necesita cambiar una línea en el fichero de
configuración para que podamos utilizar una base de datos distinta.
▪ NHibernate es software libre, distribuido bajo los términos de la LGPL
(Licencia Pública General Menor de GNU).

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 10


2. Tipos de ORM
▪ PHP=> Doctrine, Propel, ROcks, Torpor, etc..
▪ Doctrine: Es un mapeador de objetos-relacional (ORM)
escrito en PHP que proporciona una capa de
persistencia para objetos PHP. Es una capa de
abstracción que se sitúa justo encima de un SGBD
(sistema de gestión de bases de datos).

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 11


Contenido
▪ Bibliografía
1. Introducción
2. Tipos de ORM
3. Hibernate
4. Instalación
5. Creación de la Base de Datos
6. Creación de un proyecto en eclipse
7. Mapping a Hibernate
8. Anotaciones
9. HQL
10. Criteria
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 12
3. Hibernate
▪ Hibernate es una herramienta ORM para la plataforma Java
(disponible también para .Net “NHibernate”) .
▪ Hibernate facilita el mapeo de atributos entre una base de
datos relacional tradicional y el modelo de objetos de una
aplicación, mediante archivos declarativos (XML) o
anotaciones en los beans de las entidades que permiten
establecer estas relaciones.
▪ Hibernate busca solucionar el problema de la diferencia entre
los dos modelos de datos coexistentes en una aplicación: el
usado en la memoria de la computadora (orientación a
objetos) y el usado en las bases de datos (modelo
relacional).

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 13


3. Hibernate
▪ Para lograr esto permite al desarrollador detallar cómo
es su modelo de datos, qué relaciones existen y qué
forma tienen. Con esta información Hibernate le permite
a la aplicación manipular los datos en la base de datos
operando sobre objetos

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 14


3. Hibernate
▪ Un mapa de sitio web es una lista de las páginas de un
sitio web accesibles por parte de los buscadores. Puede
ser un documento en cualquier formato usado como
herramienta de planificación para el diseño de una web
como una página que lista las páginas de una web,
organizada de forma jerárquica.
▪ Los mapas de sitio aseguran que todas sus páginas
puedan ser encontradas. Esto es especialmente
importante si el sitio usa menús Adobe Flash o
JavaScript que incluyan enlaces HTML.

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 15


3. Hibernate
▪ Esto aplicado a base de datos vemos que existen
herramientas que nos ayudan a configurar un mapeo
como es Hibernate, podemos crear clases que mapeen
las entidades de una base de datos sin necesidad de
ficheros de configuración.
▪ Descargaríamos Hibernate tools y desde nuestro entorno
de desarrollo en este caso desde Eclipse realizaríamos
los siguientes pasos:
▪ Pincharíamos en este icono

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 16


3. Hibernate
▪ En el desplegable que aparece, seleccionamos “Open
Hibernate Code Generation Dialog”, y se nos abre la
ventana siguiente:

▪ Pulsaríamos en Nueva configuración


Acceso a Datos. Tema 5. Hibernate I 23/11/2023 17
3. Hibernate
▪ En la ventana que aparece (pestaña “Main”), rellenamos
el nombre de la nueva configuración, la configuración de
consola que vamos a usar y el directorio en el que se
almacenarán los ficheros generados.

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 18


3. Hibernate
▪ En la pestaña “Exporters” marcamos la opción
“Hibernate XML Mappings” y pulsamos el botón “Run” lo
generaría automáticamente:

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 19


3. Hibernate
▪ 1. La clase Java:
▪ Deben tener un constructor público sin ningún tipo de
argumentos.
▪ Para cada propiedad que queramos persistir debe haber un
método get/set asociado.
▪ Implementar la interfaz.

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 20


3. Hibernate
▪ Vemos en el código cómo la clase Profesor tiene un
constructor sin ningún tipo de argumentos. Las
propiedades id, nombre, ape1 y ape2 tienen los
métodos get y set y por último implementa el interfaz
Serializable.

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 21


3. Hibernate
▪ 2- Fichero de mapeo:
▪ Para cada clase que queremos persistir se creará un
fichero xml con la información que permitirá mapear la clase a
una base de datos relacional. Este fichero estará en el
mismo paquete que la clase a persistir.
▪ Si queremos persistir la clase Profesor deberemos crear el
fichero Profesor.hbm.xml en el mismo paquete que la clase
Java.

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 22


3. Hibernate
▪ Declaramos el fichero XML.
▪ Declaramos que es ‘Doctype’ con la referencia que
permite validarlo.
▪ El nodo raíz que es <hibernate-mapping>

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 23


3. Hibernate
▪ 3. Anotaciones Java:
▪ Estas anotaciones permiten especificar de una forma más
compacta y sencilla la información de mapeo de las
clases Java.
▪ Las anotaciones que deben usarse actualmente son las del
estándar de JPA del paquete javax.persistence.

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 24


3. Hibernate
▪ @Entity indica que esta clase
Java es una entidad a persistir.
▪ @Table indica el nombre de la
tabla de la base de datos donde
se persistirá la clase.
▪ @Id indica que este atributo es
la clave primaria.
▪ @column indica el nombre de
la columna de la base de datos
en la que se persistirá la
propiedad.

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 25


3. Hibernate
▪ Las clases persistentes son clases en una aplicación
que implementan las entidades del problema
empresarial. No se considera que todas las instancias de
una clase persistente estén en estado persistente. Una
instancia puede ser transitoria o separada.
▪ Las clases persistentes tienen cuatro reglas principales:
1. Implementación de un constructor sin argumentos.
2. Proporcionar una propiedad identificadora.
3. Crear las clases no finales.
4. Declarar métodos de acceso y de modificación para los
campos persistentes.

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 26


3. Hibernate

▪ El estado de un objeto abarca todas las propiedades del


objeto, y los valores actuales de cada una de esas
propiedades.

▪ Las propiedades de los objetos suelen ser estáticas,


mientras los valores que toman estas propiedades
cambian con el tiempo.

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 27


3. Hibernate
▪ El hecho de que los objetos tengan estado implica que ocupan un
espacio, ya en el mundo físico , ya en la memoria del ordenador.

▪ El estado de un objeto está influido por la historia del objeto.

▪ No deben confundirse los objetos, que existen en el tiempo, son


mutables, tienen estado, pueden ser creados, destruidos y
compartidos..., con los valores (los asignados a una variable, por
ejemplo) que son cantidades con las propiedades de ser atemporales,
inmutables.

▪ El estado de un objeto representa el efecto acumulado de su


comportamiento.

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 28


Acceso a Datos. Tema 5. Hibernate I 23/11/2023 29
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 30
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 31
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 32
3. Hibernate

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 33


Contenido
▪ Bibliografía
1. Introducción
2. Tipos de ORM
3. Hibernate
4. Instalación
5. Creación de la Base de Datos
6. Creación de un proyecto en eclipse
7. Mapping a Hibernate
8. Anotaciones
9. HQL
10. Criteria
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 34
4. Instalación
▪ Es necesario Eclipse https://www.eclipse.org/downloads/
▪ De eclipse es necesaria la versión Eclipse IDE for java EE
Developers
▪ MySQL https://dev.mysql.com/downloads/installer/
▪ JDK java
https://www.oracle.com/technetwork/es/java/javase/down
loads/index.html

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 35


Contenido
▪ Bibliografía
1. Introducción
2. Tipos de ORM
3. Hibernate
4. Instalación
5. Creación de la Base de Datos
6. Creación de un proyecto en eclipse
7. Mapping a Hibernate
8. Anotaciones
9. HQL
10. Criteria
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 36
5. Creación de la Base de Datos
▪ Ejemplo: crear la siguiente BBDD

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 37


5. Creación de la Base de Datos
DROP DATABASE IF EXISTS ADT5E1;
CREATE DATABASE ADT5E1;
USE ADT5E1;
CREATE TABLE Tramite (
idTram INT NOT NULL auto_increment,
tipoTram VARCHAR(45) NULL,
fhcTram DATETIME NULL,
PRIMARY KEY (idTram));

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 38


5. Creación de la Base de Datos
CREATE TABLE Avaluo (
idAval INT NOT NULL,
lugarAval VARCHAR(100) NULL,
Tramite_idTrami INT NULL,
PRIMARY KEY (idAval),
CONSTRAINT fk_Avaluo_Tramite FOREIGN KEY
(Tramite_idTrami) REFERENCES Tramite(idTram) ON
DELETE NO ACTION ON UPDATE NO ACTION);

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 39


Contenido
▪ Bibliografía
1. Introducción
2. Tipos de ORM
3. Hibernate
4. Instalación
5. Creación de la Base de Datos
6. Creación de un proyecto en eclipse
7. Mapping a Hibernate
8. Anotaciones
9. HQL
10. Criteria
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 40
6. Creación del proyecto en eclipse
▪ Opción 1:
▪ Crear el proyecto: Acceso a Datos Tema 5 Ejemplo 1
▪ Convertir el proyecto a Maven
▪ Opción 2:
▪ Crear el proyecto de tipo Maven: Acceso a Datos Tema 5
Ejemplo 1

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 41


6. Creación del proyecto en eclipse

Solo en la opción 1

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 42


6. Creación del proyecto en eclipse

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 43


6. Creación del proyecto en eclipse
▪ Maven
▪ Maven es una herramienta de software para la gestión y construcción
de proyectos Java creada por Jason van Zyl, de Sonatype, en 2002.
Es similar en funcionalidad a Apache Ant (y en menor medida a PEAR
de PHP y CPAN de Perl), pero tiene un modelo de configuración de
construcción más simple, basado en un formato XML. Estuvo
integrado inicialmente dentro del proyecto Jakarta pero ahora ya es
un proyecto de nivel superior de la Apache Software Foundation.
▪ Maven utiliza un Project Object Model (POM) para describir el
proyecto de software a construir, sus dependencias de otros módulos
y componentes externos, y el orden de construcción de los
elementos. Viene con objetivos predefinidos para realizar ciertas
tareas claramente definidas, como la compilación del código y su
empaquetado.

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 44


Acceso a Datos. Tema 5. Hibernate I 23/11/2023 45
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 46
Para asegurar que
busca las librerías

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 47


2. Add

En este archivo se van


a añadir las librerías
de hibernate

1. Seleccionar
dependencies

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 48


Buscar hibernate-core
y seleccionar la última
versión

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 49


6. Creación del proyecto en eclipse

Aquí estarían todas las


librerías necesarias
para poder ejecutar el
proyecto

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 50


6. Creación del proyecto en eclipse
▪ Si el buscador no fuera, se pueden añadir en el pom.xml
manualmente
<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>AccesoaDatos-Tema5.Tarea</groupId>
<artifactId>AccesoaDatos-Tema5.Tarea</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.hibernate.ogm</groupId>
<artifactId>hibernate-ogm-core</artifactId>
<version>5.4.1.Final</version>
</dependency>

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 51


6. Creación del proyecto en eclipse
▪ Si el buscador no fuera, se pueden añadir en el pom.xml
manualmente
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.10.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 52
6. Creación del proyecto en eclipse
▪ Si el buscador no fuera, se pueden añadir en el pom.xml
manualmente
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>5.2.1.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 53


6. Creación del proyecto en eclipse
▪ Si el buscador no fuera, se pueden añadir en el pom.xml
manualmente
<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>4.0.4</version>
</dependency>

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 54


6. Creación del proyecto en eclipse
▪ Si el buscador no fuera, se pueden añadir en el pom.xml
manualmente
<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.3</version>
</dependency>

</dependencies>
</project>
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 55
Crear el XML
hibernate.cfg.xml

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 56


6. Creación del proyecto en eclipse
Controlador

▪ Estructura

Para manejar la sesión Conexión a BBDD y


con Hibernate clases de dominio
para el mapeo

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 57


6. Creación del proyecto en eclipse
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- Ubicación de la B.D. -->
<property
name="connection.url">jdbc:mysql://localhost:3306/ADT5E1</property>
<!-- Usuario de la B.D. -->
<property name="connection.username">root</property>
<!-- Contraseña de la B.D. --> Hibernate.cfg.xml
<property name="connection.password">1234</property>
<!-- Dialecto SQL -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Mostrar en consola operaciones SQL -->
<property name="show_sql">true</property>
<!-- Use mapping basado en XML-->
<!-- Usar mapping en base a anotaciones-->
</session-factory>
</hibernate-configuration>
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 58
6. Creación del proyecto en eclipse
▪ Crear el paquete util
▪ Dentro la clase java HibernateUtil
package com.novellius.util;

import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import
org.hibernate.boot.registry.StandardServiceRegi
stry;
import
org.hibernate.boot.registry.StandardServiceRegi
stryBuilder;

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 59


6. Creación del proyecto en eclipse
public class HibernateUtil {

private static final SessionFactory sessionFactory =


buildSessionFactory();

private static SessionFactory buildSessionFactory() {


try {
// Para Hibernate 4.3.x
// Crear SessionFactory desde hibernate.cfg.xml
// Configuration configuration = new
Configuration().configure("hibernate.cfg.xml");
// return configuration.buildSessionFactory( new
StandardServiceRegistryBuilder().applySettings( configuration.getPropertie
s() ).build() );

// Para Hibernate 5.x


// Crear SessionFactory desde hibernate.cfg.xml

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 60


6. Creación del proyecto en eclipse
StandardServiceRegistry serviceRegistry = new
StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
Metadata metadata = new
MetadataSources(serviceRegistry).getMetadataBuilder().build();
return metadata.getSessionFactoryBuilder().build();

}
catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("*** Creación de SessionFactory falló." +
ex);
throw new ExceptionInInitializerError(ex);
}
}

public static SessionFactory getSessionFactory() {


return sessionFactory;
}

}
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 61
Necesario actualizar el
proyecto

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 62


Contenido
▪ Bibliografía
1. Introducción
2. Tipos de ORM
3. Hibernate
4. Instalación
5. Creación de la Base de Datos
6. Creación de un proyecto en eclipse
7. Mapping a Hibernate
8. Anotaciones
9. HQL
10. Criteria
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 63
7. Mapping a Hibernate
▪ Crear el paquete dominio
▪ Dentro la clase Tramite.java
▪ Dentro el archivo xml Tramite.hbm.xml

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 64


7. Mapping a Hibernate
package dominio;

import java.sql.Timestamp;

public class Tramite {

private int idTram;


private String tipoTram;
private Timestamp fhcTram;

public Tramite(){
}
public Tramite(String tipoTram, Timestamp fhcTram) {
this.tipoTram = tipoTram;
this.fhcTram = fhcTram;
}

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 65


7. Mapping a Hibernate
public int getIdTram() {
return idTram;
}
public void setIdTram(int idTram) {
this.idTram = idTram;
}
public String getTipoTram() {
return tipoTram;
}
public void setTipoTram(String tipoTram) {
this.tipoTram = tipoTram;
}
public Timestamp getFhcTram() {
return fhcTram;
}
public void setFhcTram(Timestamp fhcTram) {
this.fhcTram = fhcTram;
}

}
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 66
7. Mapping a Hibernate
<?xml version="1.0" encoding="UTF-8"?>

<hibernate-mapping package=“dominio">
<class name="Tramite" table="Tramite">
<!-- Mapping del id -->
<id name="idTram" column="idTram">
<generator class="native"/>
</id>

<!-- <property name="tipoTram" type="string" column="tipoTram"/> -->

<!-- Mapping del resto de las filas -->


<property name="tipoTram" type="string" />
<property name="fhcTram" type="timestamp" />
</class>
</hibernate-mapping>

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 67


7. Mapping a Hibernate
▪ En el archivo hibernate.cfg.xml donde guardar los
archivos

<!-- Use mapping basado en XML-->


<mapping resource=“dominio/Tramite.hbm.xml"/>

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 68


7. Mapping a Hibernate
▪ Crear el paquete service
▪ Crear dentro la clase tramiteService.java

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 69


7. Mapping a Hibernate
package service;
import java.util.List;
import org.hibernate.Session;
import dao.TramiteDaoImpl;
import dominio.Tramite;

public class TramiteService {

private TramiteDaoImpl tramiteDao;

public TramiteService() {
tramiteDao = new TramiteDaoImpl();
}
public void closeSession(){
tramiteDao.closeSession();
}
public void save(Tramite tramite) {
tramiteDao.save(tramite);
}
}
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 70
7. Mapping a Hibernate
▪ Crear el paquete dao
▪ Crear dentro la clase tramiteDao.java
▪ Crear dentro la clase tramiteImplDao.java

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 71


7. Mapping a Hibernate

package dao;

import dominio.Tramite;

public interface TramiteDao {

public void save(Tramite tramite);

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 72


7. Mapping a Hibernate
package dao;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Root;

import org.hibernate.Session;
import org.hibernate.Transaction;

import dominio.Tramite;
import util.HibernateUtil;

public class TramiteDaoImpl implements TramiteDao{

private Session session;


Acceso a Datos. Tema 5. Hibernate I 23/11/2023 73
7. Mapping a Hibernate
public TramiteDaoImpl() {
this.session = HibernateUtil.getSessionFactory().openSession();
}

@Override
public void save(Tramite tramite) {
Transaction tx = null;
try {
tx = session.beginTransaction();

session.save(tramite);

tx.commit();
}
catch (Exception e) {
if(tx != null){
tx.rollback();
}
e.printStackTrace();
}
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 74
7. Mapping a Hibernate
}

public void closeSession(){


session.close();
}

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 75


7. Mapping a Hibernate
▪ Crear el paquete test
▪ Crear dentro la clase Test.java

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 76


7. Mapping a Hibernate
package test;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.hibernate.Session;
import org.hibernate.Transaction;

import dominio.Tramite;
import service.TramiteService;
import util.HibernateUtil;

public class Test {

public static void main(String[] args) {

TramiteService tramiteService = new TramiteService();

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 77


7. Mapping a Hibernate
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = new Date();

// Crear una instancia de Tramite


Tramite tramite = new Tramite("Crédito rechazado", new Timestamp(date.getTime()));

// Salvar el tramite
// insert into Tramite (tipoTram, fhcTram) values (?, ?)

tramiteService.save(tramite);

}
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 78
Contenido
▪ Bibliografía
1. Introducción
2. Tipos de ORM
3. Hibernate
4. Instalación
5. Creación de la Base de Datos
6. Creación de un proyecto en eclipse
7. Mapping a Hibernate
8. Anotaciones
9. HQL
10. Criteria
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 79
Nuevo proyecto con el
8. Anotaciones código anterior
Tema 5. Ejemplo 2 Comentarla

▪ Otra forma de hacer sentencias SQL.


▪ Cambiar en el archivo hibernate.cgf.xml
<!-- Use mapping basado en XML-->
<!-- <mapping resource=“dominio/Tramite.hbm.xml"/>
-->
<!-- Usar mapping en base a anotaciones--> Añadir el modo de
mapeo
<mapping class=“dominio.Tramite"/>

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 80


8. Anotaciones
▪ Clase Tramite

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 81


8. Anotaciones
Tabla
▪ Clase Tramite
package dominio;

import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id; Primary Key
import javax.persistence.Table;

@Entity
@Table(name = "Tramite")
public class Tramite {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int idTram;
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 82
Si la columna no se
8. Anotaciones llama igual en el
▪ Clase Tramite programa, que en la
BBDD
//@Column(name="TIPO_TRAM") //Nombre distinto en BBDD
private String tipoTram;
private Timestamp fhcTram;

public Tramite(){

public Tramite(String tipoTram, Timestamp fhcTram) {


this.tipoTram = tipoTram;
this.fhcTram = fhcTram;
}

public int getIdTram() {


return idTram;
}
public void setIdTram(int idTram) {
this.idTram = idTram;}
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 83
8. Anotaciones
▪ Clase Tramite
public String getTipoTram() {
return tipoTram;
}
public void setTipoTram(String tipoTram) {
this.tipoTram = tipoTram;
}
public Timestamp getFhcTram() {
return fhcTram;
}
public void setFhcTram(Timestamp fhcTram) {
this.fhcTram = fhcTram;
}

@Override
public String toString() {
return "Tramite [idTram=" + idTram + ", tipoTram=" + tipoTram + ", fhcTram=" + fhcTram + "]";
}
}
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 84
Contenido
▪ Bibliografía
1. Introducción
2. Tipos de ORM
3. Hibernate
4. Instalación
5. Creación de la Base de Datos
6. Creación de un proyecto en eclipse
7. Mapping a Hibernate
8. Anotaciones
9. HQL
10. Criteria
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 85
9. HQL

@SuppressWarnings("unchecked")
Query<Tramite> query = session.createQuery("from Tramite where
tipoTram = :tipoTram");
query.setParameter("tipoTram", "Crédito");

List<Tramite> tramites = query.getResultList();


System.out.println(tramites.toString());

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 86


Contenido
▪ Bibliografía
1. Introducción
2. Tipos de ORM
3. Hibernate
4. Instalación
5. Creación de la Base de Datos
6. Creación de un proyecto en eclipse
7. Mapping a Hibernate
8. Anotaciones
9. HQL
10. Criteria
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 87
10. Criteria
▪ Devolver todos los datos con Criteria

// Fábrica para las piezas individuales de la criteria


CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Tramite> criteria =
builder.createQuery(Tramite.class);

// Definir el tipo de entidad que retorna la consulta


Root<Tramite> root = criteria.from(Tramite.class);

// Construyendo la consulta
criteria.select(root);

List<Tramite> tramites =
session.createQuery(criteria).getResultList();

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 88


Hibernate-
10. Criteria jpamodelgen

Última versión
▪ Para hacer consultas específicas, añadir la siguiente
librería. hibernate-jpamodelgen

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 89


Acceso a Datos. Tema 5. Hibernate I 23/11/2023 90
Habilitar

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 91


Automático

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 92


10. Criteria
▪ En mi eclipse no lo he podido conseguir. Es necesario
tener esto

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 93


10. Criteria
package dominio;

import java.sql.Timestamp;

import javax.annotation.processing.Generated;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;

@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(Tramite.class)
public abstract class Tramite_ {

public static volatile SingularAttribute<Tramite, Integer> idTram;


public static volatile SingularAttribute<Tramite, Timestamp> fhcTram;
public static volatile SingularAttribute<Tramite, String> tipoTram;

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 94


10. Criteria Añadir estos dos
métodos
▪ Clase ServiceTramite

public List<Tramite> findAll(){


return tramiteDao.findAll();
}
public List<Tramite> findFiltrando(String
nombre){
return tramiteDao.findFiltrando(nombre);
}

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 95


10. Criteria Añadir estos dos
métodos
▪ Clase TramiteDao

public List<Tramite> findAll();


public List<Tramite> findFiltrando(String nombre);

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 96


10. Criteria Añadir estos dos
métodos
▪ Clase TramiteDaoImpl
public List<Tramite> findAll(){
// Fábrica para las piezas individuales de la criteria
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Tramite> criteria = builder.createQuery(Tramite.class);

// Definir el tipo de entidad que retorna la consulta


Root<Tramite> root = criteria.from(Tramite.class);
Busca en la tabla
// Construyendo la consulta Tramite
criteria.select(root);

List<Tramite> tramites = session.createQuery(criteria).getResultList();


return tramites;
}
Se obtiene una lista
de tramites

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 97


10. Criteria Añadir estos dos
métodos
▪ Clase TramiteDaoImpl
public List<Tramite> findFiltrando(String nombre) {
// Fábrica para las piezas individuales de la criteria
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Tramite> criteria = builder.createQuery(Tramite.class);

// Definir el tipo de entidad que retorna la consulta


Root<Tramite> root = criteria.from(Tramite.class);
Sentencia Where, Busca en la tabla
filtra el tipoTram Tramite
// Construyendo la consulta
según el parámetro
criteria.select(root)
.where(builder.equal(root.get(Tramite_.tipoTram), nombre));

List<Tramite> tramites = session.createQuery(criteria).getResultList();


return tramites;
} Se obtiene una lista
de tramites

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 98


10. Criteria
▪ Clase Test
package test;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import dominio.Tramite;
import service.TramiteService;
import util.HibernateUtil;

public class Test {

public static void main(String[] args) {


Acceso a Datos. Tema 5. Hibernate I 23/11/2023 99
10. Criteria
▪ Clase Test
TramiteService tramiteService = new TramiteService();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = new Date();
// Crear una instancia de Tramite
Tramite tramite = new Tramite("Crédito rechazado", new
Timestamp(date.getTime()));

// Salvar el tramite
// insert into Tramite (tipoTram, fhcTram) values (?, ?)

tramiteService.save(tramite);
List<Tramite> tramites = tramiteService.findAll();
System.out.println(tramites.toString());
tramites = tramiteService.findFiltrando("Crédito");
System.out.println(tramites.toString());
}
}
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 100
10. Criteria
▪ Actualizar Proyecto  Acceso a Datos Tema 5
Ejemplo 3
▪ Mismo contenido que en anterior, pero con la clase Test
distinta
▪ Es posible que de error la clase Tramite_ Copiar todo el
directorio de un proyecto a otro

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 101


10. Criteria Añadir estos dos
métodos
▪ Clase TramiteService

public Tramite findOne(String nombre) {


return tramiteDao.findOne(nombre);
}
public void update(Tramite tramite) {
tramiteDao.save(tramite);

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 102


10. Criteria Añadir estos dos
métodos
▪ Clase TramiteDao

public Tramite findOne(String nombre);


public void update(Tramite tramite);

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 103


10. Criteria Añadir estos dos
métodos
▪ Clase TramiteDaoImpl
public Tramite findOne(String nombre) {

// Fábrica para las piezas individuales de la criteria


CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Tramite> criteria = builder.createQuery(Tramite.class);

// Definir el tipo de entidad que retorna la consulta


Root<Tramite> root = criteria.from(Tramite.class); Busco el objeto que
sea de tipo crédito
// Construyendo la consulta
criteria.select(root)
.where(builder.equal(root.get(Tramite_.tipoTram), nombre));

Tramite tramite = session.createQuery(criteria).getSingleResult(); Me quedo con un


return tramite; único resultado
}
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 104
10. Criteria Añadir estos dos
métodos
▪ Clase TramiteDaoImpl
@Override
public void update(Tramite tramite) {
Transaction tx = null;
try {
tx = session.beginTransaction();

session.update(tramite);

tx.commit();
}
catch (Exception e) { Actualizo el objeto en
if(tx != null){ MySQL
tx.rollback();
}
e.printStackTrace();
}
}
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 105
10. Criteria
▪ Clase Test
package test;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.hibernate.Session;
import org.hibernate.Transaction;

import dominio.Tramite;
import service.TramiteService;
import util.HibernateUtil;

public class Test {

public static void main(String[] args) {

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 106


10. Criteria
▪ Clase Test
TramiteService tramiteService = new TramiteService();

Tramite tramite = tramiteService.findOne("Crédito viejo");


System.out.println(tramite.toString());

//Actualizar el estado del trámite


tramite.setTipoTram("Otro crédito");

//Crear otro trámite


SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh_mm_ss");
Date date = new Date();
Tramite tramite2= new Tramite("Crédito nuevo", new Timestamp(date.getTime()));
tramiteService.update(tramite);
tramiteService.save(tramite2);

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 107


10. Criteria
▪ Actualizar Proyecto  Acceso a Datos Tema 5
Ejemplo 4
▪ Mismo contenido que en anterior, pero con la clase Test
distinta
▪ Es posible que de error la clase Tramite_ Copiar todo el
directorio de un proyecto a otro
▪ Se van a realizar consultas anidadas

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 108


10. Criteria Añadir estos dos
métodos
▪ Clase TramiteService

public List<Tramite> findLike(String nombre){


return tramiteDao.findLike(nombre);
}
public List<Tuple> findLikeYComparacion(String
nombre){
return tramiteDao.findLikeYComparacion(nombre);
}

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 109


10. Criteria Añadir estos dos
métodos
▪ Clase TramiteDao

public List<Tramite> findLike(String nombre);


public List<Tuple> findLikeYComparacion(String nombre);

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 110


10. Criteria Añadir estos dos
métodos
▪ Clase TramiteDaoImpl
@Override
public List<Tramite> findLike(String nombre) {
// Fábrica para las piezas individuales de la criteria
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Tramite> criteria = builder.createQuery(Tramite.class);

Root<Tramite> root = criteria.from(Tramite.class);

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");


Date parsedDate = null;
try {
parsedDate = dateFormat.parse("2021-12-18 09:10:43");
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 111
10. Criteria Añadir estos dos
métodos
▪ Clase TramiteDaoImpl
// Construyendo la consulta
criteria.select(root) Se indica que
.where(builder.and( contenga crédito en el
builder.like(root.get(Tramite_.tipoTram), "%"+nombre+"%"), tipo
builder.lessThan(root.<Timestamp>get(Tramite_.fhcTram), new
Timestamp(parsedDate.getTime()))
)
);

List<Tramite> tramites = session.createQuery(criteria).getResultList();


return tramites;
}
Le indicamos la fecha
que tiene que ser
menor

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 112


10. Criteria Añadir estos dos
métodos
▪ Clase TramiteDaoImpl
@Override
public List<Tuple> findLikeYComparacion(String nombre) {
// Fábrica para las piezas individuales de la criteria
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Tuple> criteria = builder.createQuery(Tuple.class);

Root<Tramite> root = criteria.from(Tramite.class);

Path<Integer> idTramPath = root.get(Tramite_.idTram);


Path<Timestamp> fhcTramPath = root.get(Tramite_.fhcTram);

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");


Date parsedDate = null;
try {
parsedDate = dateFormat.parse("2021-12-18 00:10:43");
} catch (ParseException e) {
// TODO Auto-generated catch block
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 113
10. Criteria Añadir estos dos
métodos
▪ Clase TramiteDaoImpl
e.printStackTrace();
}
// Construyendo la consulta
criteria.multiselect(idTramPath, fhcTramPath)
.where(builder.and(
builder.like(root.get(Tramite_.tipoTram), "%crédito%"),
builder.lessThan(root.<Timestamp>get(Tramite_.fhcTram), new
Timestamp(parsedDate.getTime()))
)
);

List<Tuple> tuples = session.createQuery(criteria).getResultList();

for(Tuple tuple : tuples){


System.out.println("tupla: " + tuple.get(idTramPath) + ", " +
tuple.get(fhcTramPath));
Acceso a Datos. Tema 5. Hibernate I 23/11/2023 114
10. Criteria Añadir estos dos
métodos
▪ Clase TramiteDaoImpl

}
return tuples;
}

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 115


10. Criteria
▪ Clase Test
package test;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.persistence.Tuple;

import org.hibernate.Session;
import org.hibernate.Transaction;

import dominio.Tramite;
import service.TramiteService;
import util.HibernateUtil;

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 116


10. Criteria
▪ Clase Test
public class Test {

public static void main(String[] args) {

TramiteService tramiteService = new TramiteService();


SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh_mm_ss");
Date date = new Date();
Tramite tramite = new Tramite("Crédito viejo", new Timestamp(date.getTime()));
tramiteService.save(tramite);
Tramite tramite2 = tramiteService.findOne("Crédito viejo");
System.out.println(tramite.toString());

// Actualizar el estado del trámite


tramite2.setTipoTram("Otro crédito");

// Crear otro trámite

Tramite tramite3 = new Tramite("Crédito nuevo", new Timestamp(date.getTime()));


Acceso a Datos. Tema 5. Hibernate I 23/11/2023 117
10. Criteria
▪ Clase Test
tramiteService.update(tramite2);
tramiteService.save(tramite3);

List<Tramite> tramites = tramiteService.findLike("Crédito");

System.out.println(tramites.toString());

List<Tuple> tuples = tramiteService.findLikeYComparacion("Crédito");

Acceso a Datos. Tema 5. Hibernate I 23/11/2023 118


Acceso a Datos – Tema 5. Hibernate I
Mario Marugán Cancio

También podría gustarte