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();

Persistencia De Objetos(Hibernate)

  • 1.
    Persistencia de ObjetosIng.Ronald Cuello Meza
  • 2.
    Que es unORMEs 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 unORMNo trabajar con filas de tablas (DataRows,RecordSet,ResultSet)
  • 4.
    Trabajar con lasclases diseñadas en su modelo del dominio
  • 5.
    Permite elegir labase de datos relacional con la que queramos interactuar (SQLServer,PostGreSQL,MySQL,Oracle…)
  • 6.
    Genera automáticamente elcódigo SQL usando un mapeo objeto-relacional ,el cual se especifica en un documento XML o anotaciones
  • 7.
    Permite crear,modificar,recuperar yeliminar 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
  • 8.
  • 9.
  • 10.
  • 11.
    Java DataObjects (JDO)
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
    Oracle TopLinkConclusiónUtilizar unframework 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 entrenegocios y persistencia
  • 21.
    Desarrollo rápidoHibernateUsar JDBCes 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 HibernateEsuna 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 ycomunidad amplia y activa
  • 25.
  • 26.
    Potente lenguaje deconsulta (HQL) ,subqueries,outer joins,ordering,paginacion,etc
  • 27.
  • 28.
    Cada clase persistentenecesita un fichero XML de mapeo del que obtiene toda la información para realizar las operaciones CRUD
  • 29.
    No es unStandard (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áles 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 HibernateHibernatesoporta, actualmente, los siguientes dialectos:
  • 32.
  • 33.
  • 34.
    Que se necesitaUnaserie 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íael 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 ficheroXMLEsquema 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 ficheroXML<?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 ficheroXML1Declaració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 dela 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 : Permitediferenciar dos sub-clases. Utilizado para el polimorfismo.
  • 41.
    proxy : Nombrede 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.
  • 43.
    type: Indica eltipo 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 archivode 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 archivode 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 laAPI 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 laAPI 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();