2. Que es un ORM Es una técnica de programación para convertir datos entre el sistema de tipos utilizado en un lenguaje de programación orientado a objetos y el utilizado en una base de datos relacional. En la práctica esto crea una base de datos orientada a objetos virtual, por sobre la base de datos relacional. Esto posibilita el uso de las características propias de la orientación a objetos (básicamente herencia y polimorfismo). Hay paquetes comerciales y de uso libre disponibles que desarrollan el mapeo relacional de objetos, aunque algunos programadores prefieren crear sus propias herramientas ORM. (Fuente Wikipedia)
22. Que es Hibernate Es una herramienta de Mapeo objeto-relacional para la plataforma Java que 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) que permiten establecer estas relaciones. Usa el mecanismo de reflexión de Java, que permite a un objeto en ejecución examinarse y manipularse a sí mismo.
28. Cada clase persistente necesita un fichero XML de mapeo del que obtiene toda la información para realizar las operaciones CRUD
29.
30. Hibernate Vs JDBC ¿Cuál es la gran diferencia entre el código tradicional JDBC y el código que escribimos con Hibernate? “Ha desparecido el SQL”. Lo único que digo es que quiero “guardar” (save) un objeto.
34. Que se necesita Una serie de JavaBeans que son las clases a persistir Un archivo XML por cada una de estas clases (MiClase.hbm.xml) que indica el mapping entre objetos y relaciones Crear/Configurar el archivo del framework hibernate.cfg.xml
35. Configurar JavaBean Este sería el aspecto del JavaBean que representa un Empleado en una supuesta aplicación: packagemx.model; public class Empleado implementsSerializable{ private Long id; privateString nombre; privateString apellido; // SettersGetters …. }
36. Estructura del fichero XML Esquema general de un fichero XML de mapeo es algo como esto: <Encabezado XML> <Declaración de la DTD> <class - Definición de la clase persistente> <id - Identificador> <generator - Clase de apoyo a la generación automática de OID's> <property – propiedades de la clase> <!--***************Asociaciones *************** --> <!--Posibles relaciones con otras entidades persistentes--> <one-to-many > <many-to-many> <many-to-one> 1 2 3 4 5 6
39. table: Nombre de la tabla en la BBDD referenciada. En esta tabla se realizaraá las operaciones de transacciones de datos. Se guardarán, modificarán o borrarán registros según la lógica de negocio de la aplicación.
43. type: Indica el tipo de los datos almacenados.6 Tipos de relaciones.(Componentes y Colecciones) En todo diseño relacional los objetos se referencian unos a otros a través de relaciones, las típicas son : uno a uno 1-1, uno a muchos 1-n, muchos a muchos n-m, muchos a uno n-1. De los cuatro tipos, dos de ellas n-m y 1-n son colecciones de objetos las cuales tendrán su propio y extenso apartado, mientras que a las relaciones 1-1 y n-1 son en realidad componentes de un objeto persistente cuyo tipo es otro objeto persistente.
44. Estructura del archivo de configuración Esquema general de un fichero XML de configuración es algo como esto: <Encabezado XML> <Declaración de la DTD> < hibernate-configuration - Definición de la configuración> <session-factory – parámetros de configuración> <property – especificación de los parámetros de configuración> <mapping - especificación de los archivos de mapeo>
46. Configuración de la API En cualquier aplicación que use Hibernate aparecen cuatro objetos básicos: Configuration: es el objeto que contiene la información necesaria para conectarse a la base de datos. Es el encargado de leerse el archivo. Hibernate.properties o Hibernate.cfg.xmlTambién es el encargado de procesar la información correspondiente a los aparejamientos. Es el encargado de leerse y verificar los archivos de emparejamiento nombreDeClasse.hbm.xml. Configuration cfg = new Configuration(); cfg.configure(RUTA_ARCHIVO_CONF); //agrega do clases dinamicamente Cfg.addClass(MiClase.Class);
47. Configuración de la API SessionFactory: es una fábrica de Sessions. Un objeto Configuration es capaz de crear una SessionFactory ya que tiene toda la información necesaria.Normalmente, una aplicación sólo tiene una SessionFactory. A partir del hibernate.cfg.xml podemos crear un SessionFactory, que es el objeto mediante el cual abrimos nuevas sesiones de Hibernate. SessionFactory sessionFactory = cfg.buildSessionFactory();
48.
49.
50. Esquema de Configuración - Hibernate.properties - Hibernate.cfg.xml - MiClase.hbm.xml - addClass Configuration Base de Datos SessionFactory Session Session Save – Update – Delete – get -load Commit RollBack BeginTransacction
51. Configuración de la API Para insertar objetos en la BBDD usaremos el método save(Object objeto) de Session, para insertar o actualizar si ya existe saveOrUpdate(Object objeto), para borrar delete(Object objeto) y para cargar un objeto desde la BBDD get(String clase, Tipo id) o load(String clase, Tipo id) que devuelven el objeto de la clase indicada por el primer parámetro y con identificador el segundo parámetro si es que existe en la BBDD. Para hacer búsquedas en la base de datos podemos usar find(String consulta) que devuelve una lista con los resultados, o iterate(String consulta) que devuelve un iterador, o bien crear un objeto Query usando createQuery(String consulta) y llamar más tarde al método find() del Query. La consulta en todos los casos estará escrita en un lenguaje similar a SQL propio de Hibernate llamado HQL (HibernateQueryLanguage)
52. Programando la API public class HibernateUtil { privatestatic final SessionFactory sessionFactory; static { try { // Createthe SessionFactory fromstandard (hibernate.cfg.xml) // configfile. Stringpath="mx/model/persistance/hibernate.cfg.xml"; Configuration cf=new Configuration(); cf.addFile(path); sessionFactory=cf.buildSessionFactory(); } catch (Throwable ex) { // Log theexception. System.err.println("Initial SessionFactory creationfailed." + ex); throw new ExceptionInInitializerError(ex); } } publicstatic SessionFactory getSessionFactory() { returnsessionFactory; } }
56. lazy ("true"|"false"): Permite el uso de inicialización "lazy". Este tipo de inicialización hace que los objetos de la colección sean solicitados en demanda y no se carguen todos a la vez. Esto es especialmente útil para optimizar búsquedas, etc...
57. inverse: Señala esta colección como el fin de una asociación bidireccional. Utilizada en relaciones many-to-many sobre todo.
59. sort: Especifica una colección con una ordenación natural o con una clase comparadora dada.
60.
61. Colecciones (Asociaciones) 1 <one-to-one> ( 1 - 1) Si la clase B no posee la misma id del padre, se generará un error de ejecución. Mapping Departamento: <class name=“Departamento" table=“departamentos"> <one-to-one name=“coordinador" class="mx.model.Empleado" /></class> Mapping Empleado: <class name=“Empleado" table=“empleados"> <one-to-one name=“departamento" class="mx.model.Departamento" /></class>
62. Colecciones (Asociaciones) 2 <many-to-one> ( 1 - 1) Definición: En esta relación se maneja de la siguiente forma, una llave foránea en una tabla esta referenciando la llave primaria de otra tabla Escenario: Tenemos 2 clases ,Empleado y Departamento relacionados de la siguiente manera: Empleado Departamento.getCoordinador() //retorna Empleado Hibernate – Mapping: <class name=“Departamento" table=“departamentos"> <many-to-one name="coordinador" column="fk_coordinador" class="mx.model.Empleado"/></class>
63. Colecciones (Asociaciones) 3 <one-to-many> ( 1 - *) Definición: La Clase A debe tener una colección que referencie a la Clase B Escenario: Tenemos 2 clases ,Empleado y Departamento relacionados de la siguiente manera: Set Empleado.getDepartamentos() //retorna Colección de instancias de Departamento Hibernate – Mapping: <class name=“Empleado" table=“empleados"> <set name="departamentos" table="departamentos"> <key column="fk_coordinador"/> <one-to-many class="mx.model.Departamento"/> </set></class>
64. Colecciones (Asociaciones) 4 <many-to-many> ( n - m) Definición: Relación de muchos a muchos donde la clase A posee una colección que referencia a B,como la relación oneToMany,pero B puede tener múltiples A. Escenario: Tenemos 2 clases ,Empleado y Cargo relacionados de la siguiente manera: Set<Cargo>Empleado.getCargos() //retorna colección de instancias de Cargo Hibernate – Mapping: <class name=“Empleado" table=“empleados"> <set name="cargos" table="empleado_cargos"> <key column="fk_empleado"/> <many-to-many class="mx.model.Cargo" column="fk_cargo" /> </set> </class>
65. Hibernate Query Language (HQL) El HQL (HibernateQueryLanguage) es un lenguaje de consulta. En el mundo relacional disponemos del SQL (StructuredQueryLanguage) que nos permite obtener información haciendo preguntas basadas en las tablas y sus columnas. El equivalente en el mundo objetual es el HQL, que nos permite hacer preguntas basadas en los objetos y sus propiedades. Una vez más, Hibernate se encarga de unir los dos mundos. Traduce las consultas que hacemos desde el mundo objetual en HQL al lenguaje de consulta del mundo relacional, el SQL, y transforma los resultados obtenidos en el mundo relacional (filas y columnas) en aquello que tiene sentido en el mundo objetual: objetos.
66. Hibernate Query Language (HQL) El concepto de “traducción” es importante para entender qué hace Hibernate y uno de los sentidos de HQL. Hemos visto más arriba la equivalencia entre una consulta SQL y una en HQL. Así, la consulta FROM Empleado e WHERE e.id = 1 se podría “traducir” a SELECT ID, NOMBRE, APELLIDOS FROM empleados WHERE id = 1 y la consulta FROM Empledo e WHERE e.nombre = ‘Ronald‘ se podría “traducir” a SELECT ID, NOMBRE, APELLIDOS FROM Empleados e WHERE e.NOMBRE = ‘Ronald’
67. HibernateQueryLanguage (HQL) Clausulas : FROM Existen varias formas de simplificar una clase a la hora de realizar la consulta hql> FROM mx.model.Empleado hql> FROM Empleado Dando como resultado una colección de objetos de tipo Empleado SELECT la clausula SELECT selecciona cual(es) objeto (s)y cual (es) propiedad(es) se retornara en el resultado del query. hql> SELECT v.marca FROM Vehiculo as v hql> SELECT v.marca FROM Vehiculo v WHERE v.marcalike ‘toy%’ hql> SELECT user.persona.nombre FROM Usuario user hql> SELECT user.username,p.nombre FROM Usuario user,Persona p La anterior consulta nos retorna Object[ ] WHERE Ayuda a filtrar la lista de instancias retornadas. hql> FROM Usuario user WHERE user.username = ‘rcuello’ hql> FROM Usuario user WHERE user.persona.cedula=123456 hql> FROM Usuario user WHERE username.username IS NOT NULL
68. HibernateQueryLanguage (HQL) ORDER BY La lista retornada por una consulta puede ser ordenada por cualquier propiedad de un objeto. hql> FROM Empleado emp ORDER BY emp.nombreasc hql> FROM Usuario user ORDER BY user.persona.apellidodesc GROUP BY Def SQL :Combina los registros con valores idénticos, en la lista de campos especificados, en un único registro. Tabla. Tiendas_info Deseamos saber las ventas totales para cada negocio. Para hacerlo, ingresaríamos, SQL > SELECT tienda, SUM( ganancia ) FROM Tiendas_info GROUP BY tienda Dando como resultado
69. HibernateQueryLanguage (HQL) GROUP BY hql> Selectt.tienda,SUM (t.ganancia) FromTiendaInfo t GROUP BY t.tienda El resultado de esta consulta es una Lista de Objects de tipo arreglo (Object[ ]) Ejemplo: Query q=session.createQuery(“Selectt.tienda,SUM (t.ganancia) FromTiendaInfo t GROUP BY t.tienda “); List lista =q.list(); For(Objectobj : lista){ Object[ ] listaObjetos=(Object[ ])obj; //donde la posicion 0 es igual a t.tienda //la posicion 1 es igual a SUM ( t.ganancia ) }
70. Hibernate Query Language (HQL) FUNCIONES ESCALARES HQL nos permite usar funciones escalares en nuestras consultas. Y las soportadas son las siguientes : Todas tienen las mismas funcionalidades del SQL SELECT COUNT(*) FROM Empleado En nuestro ejemplo, no tenemos más números que los id de las clases, así que no puedo poner ejemplos demasiado interesantes ni prácticos de las funciones escalares, pero a guisa de ejemplo, podemos obtener la media de los id de Empleado: SELECT AVG(e.id) FROM Empleado e También los podemos sumar: SELECT SUM(e.id) FROM Empleado e O obtener los valores máximo y mínimo: SELECT MAX(e.id), MIN(e.id) FROM Empleado e