SlideShare una empresa de Scribd logo
Persistencia de ObjetosIng. Ronald Cuello Meza
Que es un ORMEs 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)
Ventajas de un ORMNo trabajar con filas de tablas (DataRows,RecordSet,ResultSet)
Trabajar con las clases diseñadas en su modelo del dominio
Permite elegir la base de datos relacional con la que queramos interactuar (SQLServer,PostGreSQL,MySQL,Oracle…)
Genera automáticamente el código SQL usando un mapeo objeto-relacional ,el cual se especifica en un documento XML o anotaciones
Permite crear,modificar,recuperar y eliminar objetos persistentes recuperarlos,ademas nos permite navegar por las asociaciones entre objetos y luego actualizarlos al finalizar una transacción.Frameworks ORMSegún el lenguaje a utilizar existen varios frameworks de código abierto que resuelven el mapeo objeto-relacional comerciales y libres que realizan mapeo objeto-relacional. Por citar algunos:NeXT
 Enterprise Objects Framework
OpenStep
WebObjects
 Java Data Objects (JDO)
 Enterprise Java Beans
Hibernate
NHibernate
iPersist
Linq
EntityFramework
CastleActiveRecord
Oracle TopLinkConclusiónUtilizar un framework de ORM simplifica enormemente la programación de lógica de persistencia.Lógica de negocios basada en un modelo de dominio completamente orientado a objetos.Ahorro de código y más simple y fácil de mantener.ORM nos proporciona grandes beneficios :Independencia de la base de datos
Bajo acoplamiento entre negocios y persistencia
Desarrollo rápidoHibernateUsar JDBC es complejo y muy dependiente de la estructura de los datos. Sería más natural y mucho más sencillo trabajar directamente con objetos, pero es imposible con las BBDD relacionales, y las BBDD orientadas a objeto falta mucho por implementar.La mejor opción entonces es utilizar un motor de persistencia, que es el componente software encargado de traducir entre objetos y registros. Un motor de persistencia de código abierto es Hibernate, que nos permitirá hacer cosas como poder guardar un objeto en la base de datos simplemente con session.save(miObjeto) o borrarlo con session.delete(miObjeto).
Que es HibernateEs 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.
CaracterísticasNo es Intrusivo ( estilo POJO plain old java objects)
Buena documentación y comunidad amplia y activa
Manejo de transacciones,Caché,asociaciones,polimorfismo,herencia,persistencia transitiva, estrategias de fetching
Potente lenguaje de consulta (HQL) ,subqueries,outer joins,ordering,paginacion,etc
Fácil testeo
Cada clase persistente necesita un fichero XML de mapeo del que obtiene toda la información para realizar las operaciones CRUD
No es un Standard (Es un Framework)Hibernate Vs JDBCSin Hibernate, para añadir un registro a la tabla Empleados tendríamos que escribir algo similar a esto:[...]Class.forName(“org.hsqldb.jdbcDriver”);Stringurl = “jdbc:hsqldb:./Databases/MiEmpresa”;Connectionconnection = DriverManager.getConnection(url, “sa”, “”);Stringins = “INSERT INTO EMPLEADOS VALUES(NULL, ‘Ronald‘,’Cuello’)”;Statementstmt = null;stmt = connection.createStatement();stmt.executeUpdate(ins);[...]Con Hibernate, escribiríamos algo similar a esto:[...]Configuration conf = new Configuration();conf.addClass(Empleado.class);SessionFactorysessionFactory = conf.buildSessionFactory();Sessionsession = sessionFactory.openSession();Empleado e = new Empleado();e.setNombre(“Ronald”); e.setApellido(“Cuello”);session.save(e);session.flush();session.close();[...]
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.
Dialectos de HibernateHibernate soporta, actualmente, los siguientes dialectos:
EjemploDiagrama de entidad relación.
EjemploDiagrama de clases.
Que se necesitaUna 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 relacionesCrear/Configurar el archivo del framework hibernate.cfg.xml
Configurar JavaBeanEste 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   ….}
Estructura del fichero XMLEsquema 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>123456
Estructura del fichero XML<?xmlversion="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping>  <class name="mx.model.Empleado" table="empleados">      <id name="id" column="id">          <generator class="native"/>      </id>      <property name="nombre" column="nombre" />      <property name="apellido" column="apellido" />  </class></hibernate-mapping>
Estructura del fichero XML1Declaración de la DTD. El documento DTD que usaremos en nuestros ficheros XML se encuentra en cada distribución de Hibernate en el propio .jar o en el directorio src.Elemento Raíz <hibernate-mapping>. Dentro de él se declaran las clases de nuestros objetos persistentes. Aunque es posible declarar más de un elemento <class> en un mismo fichero XML, no debería hacerse ya que aporta una mayor claridad a nuestra aplicación realizar un documento XML por clase de objeto persistente.2<class>. Este es el tag donde declaramos nuestra clase persistente. Una clase persistente equivale a una tabla en la base de datos, y un registro o línea de esta tabla es un objeto persistente de esta clase. Entre sus posibles atributos destacaremos : name : Nombre completo de la clase o interface persistente. Deberemos incluir el package dentro del nombre.
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.
discriminator-value : Permite diferenciar dos sub-clases. Utilizado para el polimorfismo.
proxy : Nombre de la clase Proxy cuando esta sea requerida.Estructura del fichero XML3<id> Permite definir el identificador del objeto. Se corresponderá con la clave principal de la tabla en la BBDD. Es interesante definir en este momento lo que será para nuestra aplicación un OID( Identificador de Objeto ). Tenemos que asignar identificadores únicos a nuestros objetos persistentes, en un primer diseño podríamos estar tentados a asumir un dato con significado dentro de la capa de negocios del propio objeto fuese el identificador, pero esta no seria una buena elección.4<generator> clase que utilizaremos para generar los oid's5<property> Declara una propiedad persistente de la clase , que se corresponde con una columna.name: Nombre lógico de la propiedad.
column: Columna en la tabla.
type: Indica el tipo de los datos almacenados.6Tipos 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.
Estructura del archivo de configuraciónEsquema 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>
Estructura del archivo de configuración<?xmlversion="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration>  <session-factory>    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect    </property>    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver    </property>    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/base_de_datos    </property>    <property name="hibernate.connection.username">root</property>    <property name="hibernate.connection.password">123456</property>    <mapping resource="mx/model/persistance/Empleado.hbm.xml"/>  </session-factory></hibernate-configuration>
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 dinamicamenteCfg.addClass(MiClase.Class);
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();

Más contenido relacionado

PDF
오픈소스 모니터링비교
PDF
Servidor DHCP en Centos 6.5
PDF
Load Balancing-as-a-Service (LBaaS) with octavia in openstack
PPTX
Windows Server 2012 Deploying and managing
PPT
Openstack swift - VietOpenStack 6thmeeetup
PDF
Examen de conocimiento
PDF
Hands-on DNSSEC Deployment
오픈소스 모니터링비교
Servidor DHCP en Centos 6.5
Load Balancing-as-a-Service (LBaaS) with octavia in openstack
Windows Server 2012 Deploying and managing
Openstack swift - VietOpenStack 6thmeeetup
Examen de conocimiento
Hands-on DNSSEC Deployment

La actualidad más candente (14)

PDF
Docker Networking Deep Dive
PPTX
Node.js Socket.IO
PDF
Aula 1 active directory
PDF
Installation et configuration d'apache tomcat
ODP
Spring cloud for microservices architecture
PDF
Ejercicios GPOs Windows 2012
PPTX
Curl Tutorial
PPTX
Azure devops
PPTX
Ventajas y Desventajas De Sistemas Operativos
PDF
OpenStack keystone identity service
PDF
Terraform - IAC - de quoi s'agit t'il ?.pdf
PPTX
Herd your chickens: Ansible for DB2 configuration management
PPTX
Easy Java Integration Testing with Testcontainers​
PDF
Redux Toolkit & RTK Query in TypeScript: tips&tricks
Docker Networking Deep Dive
Node.js Socket.IO
Aula 1 active directory
Installation et configuration d'apache tomcat
Spring cloud for microservices architecture
Ejercicios GPOs Windows 2012
Curl Tutorial
Azure devops
Ventajas y Desventajas De Sistemas Operativos
OpenStack keystone identity service
Terraform - IAC - de quoi s'agit t'il ?.pdf
Herd your chickens: Ansible for DB2 configuration management
Easy Java Integration Testing with Testcontainers​
Redux Toolkit & RTK Query in TypeScript: tips&tricks
Publicidad

Destacado (14)

PDF
Persistencia de datos en Java
PPTX
Hibernate 3.2 short manual
PPTX
Introducción a ORMs
PDF
Hibernate
PPT
Building a Testable Data Access Layer
PPTX
Microsoft Data Access Technologies
PDF
Hibernate - JPA @luce 5
PDF
Delegation
PDF
J2ee (java ee) design patterns and architecture
PPT
PDF
Bases de Datos en Java - Intro a Hibernate
PPT
JPA en Netbeans
PDF
Javantura v4 - Security architecture of the Java platform - Martin Toshev
PPT
PERSISTENCIA BASADA EN ARCHIVOS
Persistencia de datos en Java
Hibernate 3.2 short manual
Introducción a ORMs
Hibernate
Building a Testable Data Access Layer
Microsoft Data Access Technologies
Hibernate - JPA @luce 5
Delegation
J2ee (java ee) design patterns and architecture
Bases de Datos en Java - Intro a Hibernate
JPA en Netbeans
Javantura v4 - Security architecture of the Java platform - Martin Toshev
PERSISTENCIA BASADA EN ARCHIVOS
Publicidad

Similar a Persistencia de objetos con Hibernate (20)

PPSX
Persistencia De Objetos(Hibernate)
PDF
06 - HIBERNATE sistema de informacion 1.pdf
PDF
Orm presentación final
PDF
Sesion03 apuntes
PDF
Hibernate - JPA @luce
DOC
Hibernate
PDF
Orm final
PPT
Persistencia de un modelo de objetos
ODT
PDF
Manual hibernate
PPTX
Hibernate framework
PPT
PPT
Conceptos de hibernate
PPT
Persistencia de datos_hibernate_arquitecturas_de_software
PDF
Hibernate - Introducción
PPT
Spring ORM
PPT
Curso de Desarrollo Web
PPT
Persistence
Persistencia De Objetos(Hibernate)
06 - HIBERNATE sistema de informacion 1.pdf
Orm presentación final
Sesion03 apuntes
Hibernate - JPA @luce
Hibernate
Orm final
Persistencia de un modelo de objetos
Manual hibernate
Hibernate framework
Conceptos de hibernate
Persistencia de datos_hibernate_arquitecturas_de_software
Hibernate - Introducción
Spring ORM
Curso de Desarrollo Web
Persistence

Más de Mauro Gomez Mejia (20)

PDF
PDF
PDF
Encapsulamiento
PDF
Polimorfismo (Clases Abstractas)
PDF
Polimorfismo
PDF
2011 horizon-report
PDF
Spring mvc
PDF
PDF
2010 horizon-report
PDF
Sql injection
PDF
J M E R L I N P H P
PDF
Jquery para principianes
PDF
Jmerlin php
PDF
Comunicacion Java Envio De Datos Al Puerto Paralelo
PDF
Cuadrados Mágicos De Orden Impar
PDF
Redes De Computadores
PDF
PDF
Java A Tope J2 Me (Java 2 Micro Edition)
Encapsulamiento
Polimorfismo (Clases Abstractas)
Polimorfismo
2011 horizon-report
Spring mvc
2010 horizon-report
Sql injection
J M E R L I N P H P
Jquery para principianes
Jmerlin php
Comunicacion Java Envio De Datos Al Puerto Paralelo
Cuadrados Mágicos De Orden Impar
Redes De Computadores
Java A Tope J2 Me (Java 2 Micro Edition)

Persistencia de objetos con Hibernate

  • 1. Persistencia de ObjetosIng. Ronald Cuello Meza
  • 2. Que es un ORMEs 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)
  • 3. Ventajas de un ORMNo trabajar con filas de tablas (DataRows,RecordSet,ResultSet)
  • 4. Trabajar con las clases diseñadas en su modelo del dominio
  • 5. Permite elegir la base de datos relacional con la que queramos interactuar (SQLServer,PostGreSQL,MySQL,Oracle…)
  • 6. Genera automáticamente el código SQL usando un mapeo objeto-relacional ,el cual se especifica en un documento XML o anotaciones
  • 7. Permite crear,modificar,recuperar y eliminar objetos persistentes recuperarlos,ademas nos permite navegar por las asociaciones entre objetos y luego actualizarlos al finalizar una transacción.Frameworks ORMSegún el lenguaje a utilizar existen varios frameworks de código abierto que resuelven el mapeo objeto-relacional comerciales y libres que realizan mapeo objeto-relacional. Por citar algunos:NeXT
  • 11. Java Data Objects (JDO)
  • 16. Linq
  • 19. Oracle TopLinkConclusiónUtilizar un framework de ORM simplifica enormemente la programación de lógica de persistencia.Lógica de negocios basada en un modelo de dominio completamente orientado a objetos.Ahorro de código y más simple y fácil de mantener.ORM nos proporciona grandes beneficios :Independencia de la base de datos
  • 20. Bajo acoplamiento entre negocios y persistencia
  • 21. Desarrollo rápidoHibernateUsar JDBC es complejo y muy dependiente de la estructura de los datos. Sería más natural y mucho más sencillo trabajar directamente con objetos, pero es imposible con las BBDD relacionales, y las BBDD orientadas a objeto falta mucho por implementar.La mejor opción entonces es utilizar un motor de persistencia, que es el componente software encargado de traducir entre objetos y registros. Un motor de persistencia de código abierto es Hibernate, que nos permitirá hacer cosas como poder guardar un objeto en la base de datos simplemente con session.save(miObjeto) o borrarlo con session.delete(miObjeto).
  • 22. Que es HibernateEs 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.
  • 23. CaracterísticasNo es Intrusivo ( estilo POJO plain old java objects)
  • 24. Buena documentación y comunidad amplia y activa
  • 26. Potente lenguaje de consulta (HQL) ,subqueries,outer joins,ordering,paginacion,etc
  • 28. Cada clase persistente necesita un fichero XML de mapeo del que obtiene toda la información para realizar las operaciones CRUD
  • 29. No es un Standard (Es un Framework)Hibernate Vs JDBCSin Hibernate, para añadir un registro a la tabla Empleados tendríamos que escribir algo similar a esto:[...]Class.forName(“org.hsqldb.jdbcDriver”);Stringurl = “jdbc:hsqldb:./Databases/MiEmpresa”;Connectionconnection = DriverManager.getConnection(url, “sa”, “”);Stringins = “INSERT INTO EMPLEADOS VALUES(NULL, ‘Ronald‘,’Cuello’)”;Statementstmt = null;stmt = connection.createStatement();stmt.executeUpdate(ins);[...]Con Hibernate, escribiríamos algo similar a esto:[...]Configuration conf = new Configuration();conf.addClass(Empleado.class);SessionFactorysessionFactory = conf.buildSessionFactory();Sessionsession = sessionFactory.openSession();Empleado e = new Empleado();e.setNombre(“Ronald”); e.setApellido(“Cuello”);session.save(e);session.flush();session.close();[...]
  • 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.
  • 31. Dialectos de HibernateHibernate soporta, actualmente, los siguientes dialectos:
  • 34. Que se necesitaUna 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 relacionesCrear/Configurar el archivo del framework hibernate.cfg.xml
  • 35. Configurar JavaBeanEste 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 XMLEsquema 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>123456
  • 37. Estructura del fichero XML<?xmlversion="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping> <class name="mx.model.Empleado" table="empleados"> <id name="id" column="id"> <generator class="native"/> </id> <property name="nombre" column="nombre" /> <property name="apellido" column="apellido" /> </class></hibernate-mapping>
  • 38. Estructura del fichero XML1Declaración de la DTD. El documento DTD que usaremos en nuestros ficheros XML se encuentra en cada distribución de Hibernate en el propio .jar o en el directorio src.Elemento Raíz <hibernate-mapping>. Dentro de él se declaran las clases de nuestros objetos persistentes. Aunque es posible declarar más de un elemento <class> en un mismo fichero XML, no debería hacerse ya que aporta una mayor claridad a nuestra aplicación realizar un documento XML por clase de objeto persistente.2<class>. Este es el tag donde declaramos nuestra clase persistente. Una clase persistente equivale a una tabla en la base de datos, y un registro o línea de esta tabla es un objeto persistente de esta clase. Entre sus posibles atributos destacaremos : name : Nombre completo de la clase o interface persistente. Deberemos incluir el package dentro del nombre.
  • 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.
  • 40. discriminator-value : Permite diferenciar dos sub-clases. Utilizado para el polimorfismo.
  • 41. proxy : Nombre de la clase Proxy cuando esta sea requerida.Estructura del fichero XML3<id> Permite definir el identificador del objeto. Se corresponderá con la clave principal de la tabla en la BBDD. Es interesante definir en este momento lo que será para nuestra aplicación un OID( Identificador de Objeto ). Tenemos que asignar identificadores únicos a nuestros objetos persistentes, en un primer diseño podríamos estar tentados a asumir un dato con significado dentro de la capa de negocios del propio objeto fuese el identificador, pero esta no seria una buena elección.4<generator> clase que utilizaremos para generar los oid's5<property> Declara una propiedad persistente de la clase , que se corresponde con una columna.name: Nombre lógico de la propiedad.
  • 42. column: Columna en la tabla.
  • 43. type: Indica el tipo de los datos almacenados.6Tipos 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ónEsquema 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>
  • 45. Estructura del archivo de configuración<?xmlversion="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect </property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver </property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/base_de_datos </property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <mapping resource="mx/model/persistance/Empleado.hbm.xml"/> </session-factory></hibernate-configuration>
  • 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 dinamicamenteCfg.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. Configuración de la API Session: La principal interfaz entre la aplicación Java e Hibernate. Es la que mantiene las conversaciones entre la aplicación y la base de datos. Permite añadir, modificar y borrar objetos en la base de datos.Session session= sessionFactory.openSession();
  • 49. Configuración de la API Transaction: Como su nombre indica, se encarga de la transaccionalidad. Permite definir unidades de trabajo.Transaction tx = session.beginTransaction();[...]session.save(unaCategoria);tx.commit();[...]tx.rollback();
  • 50. Esquema de Configuración- Hibernate.properties- Hibernate.cfg.xml- MiClase.hbm.xml- addClassConfigurationBase de DatosSessionFactorySessionSessionSave – Update – Delete – get -loadCommitRollBackBeginTransacction
  • 51. Configuración de la APIPara 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 APIpublic 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; }}
  • 53. Creación de CRUDpublicstaticListfindAll(){ Session session=HibernateUtil.getSessionFactory().openSession();Query q=session.createQuery("From Empleado e");returnq.list(); }publicstatic Empleado findById(Long id){ Session s=HibernateUtil.getSessionFactory().openSession();return (Empleado)s.get(Empleado.class, id); }publicstaticvoidsave(Empleado e){ Session s=HibernateUtil.getSessionFactory().openSession();s.getTransaction().begin(); try{s.persist(e);s.getTransaction().commit(); }catch(Exceptionexc){s.getTransaction().rollback();exc.printStackTrace(); }
  • 54. ColeccionesLas colecciones son declaradas utilizando<set>, <list>, <map>, <bag>, <array> y <primitive-array>. Los posibles parámetros y sus valores son :name: El nombre lógico de la propiedad. Es útil poner un nombre que nos recuerde el rol de la colección (ej: cargos, departamentos, etc.. )
  • 55. table: Nombre de la tabla de la colección.
  • 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.
  • 58. cascade: Permite las operaciones en cascada hacia las entidades hijas.
  • 59. sort: Especifica una colección con una ordenación natural o con una clase comparadora dada.
  • 60. order-by: Columna\s de la tabla que definen el orden de iteración. Puede ser ascendente o descendente.Colecciones (Asociaciones)1<one-to-one> ( 1 - 1)Definición:Es nuestra primera relación simple. En esta relación ,una Clase tiene una referencia a una instancia a otra Clase y están relacionadas bajo una misma llave PK,aunque si no manejamos integridad referencial podemos hacer que sea el índice que queramos , como puede ser una FK o cualquier otro valor que tengan en común las dos tablas. Esta relación puede ser BIDIRECCIONAL Escenario:Tenemos 2 clases ,Empleado y Departamento relacionados de la siguiente manera:Empleado Departamento.getCoordinador()//retorna DepartamentoDepartamento Empleado.getDepartamento()//retorna Empleado
  • 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 deotra tabla Escenario:Tenemos 2 clases ,Empleado y Departamento relacionados de la siguiente manera:Empleado Departamento.getCoordinador()//retorna EmpleadoHibernate – 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 BEscenario:Tenemos 2 clases ,Empleado y Departamento relacionados de la siguiente manera:Set Empleado.getDepartamentos()//retorna Colección de instancias de DepartamentoHibernate – 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 CargoHibernate – 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 consultaFROM Empleado e WHERE e.id = 1se podría “traducir” aSELECT ID, NOMBRE, APELLIDOS FROM empleados WHERE id = 1y la consultaFROM Empledo e WHERE e.nombre = ‘Ronald‘se podría “traducir” aSELECT ID, NOMBRE, APELLIDOS FROM Empleados e WHERE e.NOMBRE = ‘Ronald’
  • 67. HibernateQueryLanguage (HQL)Clausulas :FROMExisten varias formas de simplificar una clase a la hora de realizar la consultahql> FROM mx.model.Empleado hql> FROM EmpleadoDando como resultado una colección de objetos de tipo EmpleadoSELECTla 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 vhql> SELECT v.marca FROM Vehiculo v WHERE v.marcalike ‘toy%’hql> SELECT user.persona.nombre FROM Usuario userhql> SELECT user.username,p.nombre FROM Usuario user,Persona pLa anterior consulta nos retorna Object[ ]WHEREAyuda a filtrar la lista de instancias retornadas.hql> FROM Usuario user WHERE user.username = ‘rcuello’hql> FROM Usuario user WHERE user.persona.cedula=123456hql> FROM Usuario user WHERE username.username IS NOT NULL
  • 68. HibernateQueryLanguage (HQL)ORDER BYLa lista retornada por una consulta puede ser ordenada por cualquier propiedad de un objeto.hql> FROM Empleado emp ORDER BY emp.nombreaschql> FROM Usuario user ORDER BY user.persona.apellidodescGROUP BYDef SQL :Combina los registros con valores idénticos, en la lista de campos especificados, en un único registro. Tabla. Tiendas_infoDeseamos saber las ventas totales para cada negocio. Para hacerlo, ingresaríamos, SQL > SELECT tienda, SUM( ganancia ) FROM Tiendas_info GROUP BY tiendaDando como resultado
  • 69. HibernateQueryLanguage (HQL)GROUP BYhql> Selectt.tienda,SUM (t.ganancia) FromTiendaInfo t GROUP BY t.tiendaEl 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 ESCALARESHQL nos permite usar funciones escalares en nuestras consultas. Y las soportadas son las siguientes :Todas tienen las mismas funcionalidades del SQLSELECT COUNT(*) FROM EmpleadoEn 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 eTambién los podemos sumar:SELECT SUM(e.id) FROM Empleado eO obtener los valores máximo y mínimo:SELECT MAX(e.id), MIN(e.id) FROM Empleado e
  • 71. HibernateQueryLanguage (HQL)ExpresionesLas expresiones estan permitidas para la clausula WHERE ,y se incluyen casi la gran mayoria de SQL:Operadoresmatemáticos +, -, *, /
  • 81. Valores de Enumeraciones y constantes Vehiculo.Color.REDEjercicios1
  • 85. Gracias por su atención