Hibernate
Upcoming SlideShare
Loading in...5
×
 

Hibernate

on

  • 836 views

 

Statistics

Views

Total Views
836
Views on SlideShare
836
Embed Views
0

Actions

Likes
0
Downloads
28
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft Word

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Hibernate Hibernate Document Transcript

    • Persistencia Hibernate1.0 DEFINICION DE HIBERNATE los conocidos patrones para la delegación de persistencia en POJOs.Hibernate es una herramienta para la Una característica de la filosofía de diseñoplataforma Java que facilita el mapeo de de Hibernate ha de ser destacadaatributos entre una base de datos relacional especialmente, dada su gran importancia:y el modelo de objetos de una aplicación, puede utilizar los objetos Java definidos pormediante archivos declarativos (XML) que el usuario tal cual, es decir, no utilizapermiten establecer estas relaciones. técnicas como generación de código a partirHibernate es una herramienta ORM de descriptores del modelos de datos ocompleta que ha conseguido en un tiempo manipulación de bytecodes en tiempo derecord una excelente reputación en la compilación (técnica conocida por sucomunidad de desarrollo posicionándose amplio uso en JDO), ni obliga aclaramente como el producto OpenSource implementar interfaces determinados, nilíder en este campo gracias a sus heredar de una superclase. Utiliza en vez deprestaciones, buena documentación y ello el mecanismo de reflexión de Java,estabilidad. Es valorado por muchos incluso característica que le permite un modeladocomo solución superior a productos iterativo fluido y natural basado en UML,comerciales dentro de su enfoque, siendo un factor fundamental para lograr ununa muestra clara de su reputación y trabajo ágil y productivo. Además abre lassoporte la reciente integración dentro del puertas a utilizar herencia en el modelo degrupo JBoss que seguramente generará datos (esta opción estaría limitada si unainiciativas muy interesantes para el uso de herramienta nos obliga a que los objetos deHibernate dentro de este servidor de datos hereden de una superclase por noaplicaciones. soportar Java herencia múltiple).Se empezó a desarrollar hace algo más de 2años por Gavin King siendo hoy Gavin y Hibernate – CaracterísticasChristian Bauer los principales gestores desu desarrollo. • No intrusivo (estilo POJO)Hibernate parte de una filosofía de mapear • Muy buena documentación (forumsobjetos Java "normales", también conocidos para ayuda, libro)en la comunidad como "POJOs" (Plain Old • Comunidad activa con muchos usuariosJava Objects), no contempla la posibilidad • Transacciones, caché, asociaciones,de automatizar directamente la persistencia polimorfismo, herencia, lazy loading,de Entity Beans tipo BMP (es decir, generar persistencia transitiva, estrategias deautomáticamente este tipo de objetos), fetching.aunque aún así es posible combinarHibernate con este tipo de beans utilizando 1
    • Persistencia Hibernate• Potente lenguaje de consulta (HQL): objetos en nuestra aplicación y en algún subqueries, outer joins, ordering, momento queremos que sean persistentes, proyeccion (report query), paginacion. normalmente abriremos una conexión• Facil testeo. JDBC, crearemos una sentencia SQL y• No es estandard. copiaremos todos los valores de las propiedades sobre una PreparedStatement o en la cadena SQL que estemos¿Por qué necesitamos Hibernate? construyendo. Esto podría ser fácil para un objeto de tipo valor (value object:VO) de pequeño tamaño pero consideremos esto para un objeto con muchas propiedades. Este no es el único problema. ¿Qué pasa con las asociaciones? ¿Y si el objeto contiene a su vez a otros objetos? ¿Los almacenaremos también en la Base de Datos? ¿Automáticamente? ¿Manualmente? ¿Qué haremos con las claves ajenas? Preguntas similares surgen a la hora deSi se esta trabajando con programación “cargar” un dato de la BD de un VO (seorientada a objetos y bases de datos denomina value object o VO a un objetorelacionales, seguramente habrás observado que contiene información de negocioque estos son dos paradigmas diferentes. estructurada en grupos de ítems de datos,El modelo relacional trata con relaciones, también recibe el nombre de transfertuplas y conjuntos y es muy matemático por object).naturaleza. Sin embargo, el paradigma Como se puede ver, la brecha existenteorientado a objetos trata con objetos, sus entre los paradigmas de objeto y relacionalatributos y relaciones entre objetos. Cuando se vuelve mucho mayor si disponemos dese quiere hacer que los objetos sean modelos con objetos “grandes”. Y haypersistentes utilizando para ello una base de muchas más cosas a considerar como ladatos relacional, uno se da cuenta de que carga lenta, las referencias circulares, elhay una desavenencia entre estos dos caché, etc. De hecho, hay estudios queparadigmas, la también llamada diferencia demuestran que el 35% del código de unaobjeto-relacional (object – relational gap”). aplicación se produce como consecuenciaUn mapeador objeto-relacional (ORM ) nos del mapeado (correspondencia) entre losayudará a evitar esta diferencia. datos de la aplicación y el almacén de¿Cómo se manifiesta esta brecha entre datos.ambos paradigmas? Si estamos utilizando 2
    • Persistencia HibernateEntonces, lo que necesitamos es una de la persistencia, como los Ejes de entidad,herramienta ORM (Object Relational es que la clase Hibernate persistente puedeMapping). Básicamente, una ORM intenta utilizarse en cualquier contexto dehacer todas estas tareas pesadas por ejecución, es decir, no se necesita unnosotros. Con una buena ORM, sólo contenedor especial para ello.tendremos que definir la forma en la queestablecemos la correspondencia entre las Hibernate Query Language HQLclases y las tablas una sola vez (indicandoque propiedad se corresponde con que Hibernate nos proporciona además uncolumna, que clase con que tabla, etc.). lenguaje para el manejo de consultas a laDespués de esto, podremos hacer cosas base de datos.como utilizar POJO’s (Plain Old Java Este lenguaje es similar a SQL y esObjects) de nuestra aplicación y decirle a utilizado para obtener objetos de la base denuestra ORM que los haga persistentes, con datos según las condiciones especificadasuna instrucción similar a esta: en el HQL.orm.save(myObject). Es decir, una El uso de HQL nos permite usar unherramienta puede leer o escribir en la base lenguaje intermedio que según la base dede datos utilizando VO’s directamente. datos que usemos y el dialecto queMás formalmente: un modelo del dominio especifiquemos será traducido al SQLrepresenta las entidades del negocio dependiente de cada base de datos de formautilizadas en una aplicación Java. En una automática y transparentearquitectura de sistemas por capas, elmodelo del dominio se utiliza para ejecutar Herramientas usadas junto conla logica del negocio (en Java, no en la base Hibernatede datos). Esta capa del negocio secomunica con la capa de persistencia Existen diversas herramientas útiles para elsubyacente para recuperar y almacenar los uso de Hibernate que cubren todo elobjetos persistentes del modelo del desarrollo desde nuestra aplicación hastadominio. ORM es el middleware en la capa nuestra base de datos y viceversa:de persistencia que gestiona la persistencia.Hibernate es un ORM de libre distribución,que además, es de las más maduras ycompletas. Actualmente su uso esta muyextendido y además esta siendodesarrollada de forma muy activa. Unacaracterística muy importante que distingueHibernate de otras soluciones al problema 3
    • Persistencia Hibernate rasgos al concepto de conexión de JDBC y cumple un papel muy parecido, es decir, sirve para delimitar una o varias operaciones relacionadas dentro de un proceso de negocio, demarcar una transacción y aporta algunos servicios adicionales como una caché de objetos para evitar interacciones innecesarias contra la BD. En este sentido veremos que la clase Session ofrece métodos como save(Object object), createQuery(String queryString),Desde herramientas de modelado UML beginTransaction(), close(), etc. paracomo por ejemplo con Poseidon podemos interactuar con la BD tal como estamosgenerar modelos entidad relación que son acostumbrados a hacerlo con una conexióntraducidos por AndroMDA a POJOs y JDBC (de hecho "envuelve" una conexiónmediante XDoclet se generan los ficheros JDBC), pero con una diferencia: mayorHBM. Todas estas tareas se automatizan simplicidad, es decir, guardar un objeto, pormediante el uso de ANT. ejemplo, consiste en algo así como session.save(miObjecto), sin necesidad deOtra opción es crear la base de datos con especificar una sentencia SQL, y esto esuna herramienta de modelado y a partir de sólo un ejemplo muy trivial en el quela base de datos una vez creada usar ganamos relativamente poco utilizandoMiddlegen para generar los ficheros HBM Hibernate.y a partir de estos los POJOs mediantehbm2java Con esto volvemos a los conceptos de transient y persistent: los primeros sonLos conceptos básicos de Hibernate objetos que sólo existen en memoria y no en un almacén de datos (recuérdese en esteHibernate se distingue entre objetos tipo sentido también el modificador transient detransient y tipo persistent. Java), en algunos casos, no seránPara almacenar y recuperar estos objetos de almacenados jamás en la base de datos y enla base de datos, el desarrollador debe otros es un estado en el que se encuentranmantener una conversación con el motor de hasta ser almacenados en ella. LosHibernate mediante un objeto especial, segundos se caracterizan por haber sido yaquizás el concepto clave más importante almacenados y ser por tanto objetosdentro Hibernate, que es la Sesión (clase persistentes. Dicho de otra: manera losSession). Se puede equiparar a grandes objetos transient han sido instanciados por 4
    • Persistencia Hibernateel desarrollador sin haberlos almacenado perteneciente a su correspondientes thread ymediante una sesión, los objetos con su contexto de objetos en caché,persistentes han sido creados y transacciones, etc. Como tal no sorprendealmacenados en una sesión o bien devueltos que las sesiones no son “thread-safe” y queen una consulta realizada con la sesión. la información vinculada a ella no sea visible para otras sesiones. Es tambiénIgual que con las conexiones JDBC hemos lógico que tenga que existir unade crear y cerrar sesiones, aunque no hay “institución” superior para crear sesiones yuna relación 1:1 entre sesiones y realizar operaciones comunes a losconexiones, es decir, no tenemos que abrir diferentes threads como lo puede ser lay cerrar simultáneamente sesiones y gestión de una caché compartida entreconexiones JDBC, la política a seguir threads o caché de segundo nivel. Estedependerá del contexto del proceso de elemento es la clase SessionFactory y ennegocio de cada situación dándonos ella podremos encontrar métodos comoHibernate amplias posibilidades para la openSession()o evict(Class persistentClass).implementación de nuestras políticas Por fin tenemos que pensar también en qué(conexiones JDBC gestionadas por la sucede si en un entorno de múltiples hilosaplicación, por Hibernate, por un posible de ejecución la aplicación accede a unservidor de aplicaciones, etc.), siendo mismo objeto desde dos sesiones diferentes.solamente necesario en la práctica crear y Vimos que una instancia de un objetocerrar explícitamente las sesiones de persistente nunca es compartida por dosHibernate. sesiones al contar cada una con su propioHemos visto que las sesiones son un contexto para ello, de modo que existiránconcepto ligado a un proceso de negocio, dos instancias dentro de la misma máquinapor tanto es natural pensar que una sesión virtual Java para un “mismo” objeto desiempre va a pertenecer a un mismo thread datos, lo cual no lleva al concepto dede ejecución (el que pertenece a la identidad.ejecución de un método de negocio para un Hay que distinguir entre identidad deusuario o sistema externo concreto), aunque instancia Java, es decir: objeto1 == objeto2,técnicamente se pueden compartir sesiones identidad persistente:entre threads, esto no se debe hacer jamás objeto1.getId().equals(objeto2.getId)) y lapor no ser una buena política de diseño y identidad a nivel de base de datos (claveslos consecuentes problemas que puede primarias iguales). Por tanto, puede habergenerar. dentro de la misma máquina virtual variosEs decir, en un entorno multiusuario y por objetos con la misma identidad persistente,tanto multithread habrá por tanto múltiples pero diferentes identidades como instanciassesiones simultáneas, cada una por ser objetos de datos Java que 5
    • Persistencia Hibernaterepresentan la misma entidad persistente. configurar Hibernate en unNormalmente la identidad persistente del entorno no gestionado, esobjeto y la identidad de base de datos importante comprender lacoincidirán, pero esto puede no ser así paralógicas de negocio muy particularidad. En diferencia entre latodo caso, esta política depende del configuración de Hibernatedesarrollador que puede jugar, por ejemplo, para entornos gestionados ycon sobreescribir el método equals() para no gestionados:definir un comportamiento peculiar yutilizar claves especiales para la identidad • Entorno gestionado: los pools dede objetos diferenciándolas o recursos tales comorelacionándolas con la propiedad del objeto conexiones a la base deutilizada como clave primaria para su datos permiten establecer lospresistencia en la base de datos. límites de lasConfiguración de Hibernate transacciones y laPara utilizar Hibernate en una aplicación, es seguridad se debenecesario conocer como configurarlo. especificar de formaHibernate puede configurarse declarativa, es decir en susy ejecutarse en la mayoría de metadatos. Un servidor deaplicaciones java y entornos aplicaciones J2EE, talde desarrollo. Generalmente, como JBoss, BeaHibernate se utiliza en WebLogic o IBMaplicaciones cliente/servidor WebSphere implementande dos y tres capas, un entorno gestionadodesplegándose Hibernate para Java.únicamente en el servidor. • Entorno no gestionado:Las aplicaciones cliente proporciona una gestiónnormalmente utilizan un básica de la concurrencia anavegador Web, pero las través de un pooling deaplicaciones swing y AWT threads. Un contenedor detambién son usuales. Aunque servlets, como Tomcatsolamente vamos a ver como proporciona un entorno de 6
    • Persistencia Hibernate servidor no gestionado Configuración de la base de datos para aplicaciones Web Java. Una aplicación stand-alone también se considera como no gestionada. Los entornos no gestionados no proporcionan infraestructura para transacciones automáticas, gestiones de Resumen de pasos de configuración recursos, o seguridad. La propia aplicación es la que • Situar el *.jar del driver JDBC elegido gestiona las conexiones y el fichero hibernate2.jar en nuestro con la base de datos y classpath establece los límites de las • Añadir las dependencias de Hibernate transacciones. (directorio (lib)) en el classpath.Tanto en un entorno gestionado como en (lib/README.txt contiene una lista deuno no gestionado, lo primero que debemos librerías requeridas yhacer es iniciar Hibernate. Para hacer esto opcionales).debemos crear una Session Factory desde • Elegir y configurar un pooluna Configuration. de conexiones JDBC • Determinar las propiedades de Configuración en un fichero hibernate.properties en el classpath, • Crear una instancia de Configuración en nuestra 7
    • Persistencia Hibernate aplicación y cargar los - Session: interfaz primaria utilizada en cualquier aplicación Hibernate ficheros de mapeado XML (SessionFactory). utilizando addResource() o - Transaction addClass(). - Query: permite realizar peticiones a la• Obtener una base de datos y controla cómo se ejecuta dicha petición (query). Las SessionFactory a partir de peticiones se escriben en HQL o en el Configuration llamando a dialecto SQL nativo de la base de datos BuildSessionFactory(). que estamos utilizando. Una instancia Query se utiliza para enlazar los2.0 ARQUITECTURA parámetros de la petición, limitar el numero de resultados devueltos por laEl API de Hibernate es una arquitectura de petición y para ejecutar dicha petición.dos capas (Capa de persistencia y Capa de • Interfaces llamadas por el código de laNegocio). infraestructura de la aplicación paraEn la siguiente Figura se muestran los roles configurar Hibernate. La más importantede las interfaces Hibernate más importantes es la clase Configuration: se utiliza paraen las capas de persistencia y de negocio de configurar y "arrancar" Hibernate. Launa aplicación J2EE. La capa de negocio aplicación utiliza una instancia deestá situada sobre la capa de persistencia, Configuration para especificar ladebido a que actúa como un cliente de la ubicación de los documentos que indicancapa de persistencia. el mapeado de los objetos y propiedades específicas de Hibernate, y a continuación crea la Session Factory. • Interfaces callback que permiten a la aplicación reaccionar ante determinados eventos que ocurren dentro de la aplicación, tales como Interceptor, Lifecycle, y Validatable. • Interfaces que permiten extender las funcionalidades de mapeado deLas Interfaces mostradas se clasifican de la Hibernate, como por ejemplo UserType,siguiente forma: CompositeUserType, e• Interfaces llamadas por la aplicación para IdentifierGenerator. realizar operaciones básicas: Además, Hibernate hace uso de APIs de Java, tales como JDBC, JTA (Java 8
    • Persistencia HibernateTransaction Api) y JNDI (Java Naming administrativas que supone laDirectory Interface). celebración de un evento en la Feria de Muestras de Valencia.3.0 APLICACIÓN Además se pretende no solo simplificar sino unificar y asegurar elPrácticamente, no hay lugar donde el uso de cumplimiento de todas las tareas deeste framework no sea útil, las aplicaciones cada proceso de negocio.Java que requieran una constante La intranet esta desarrollada con lasmanipulación de base de datos requieren siguientes tecnologías:por su facilidad de manejo y versatilidadpara los desarrolladores optar por Hibernate: motor de persistencia.Hibernate. SQLServer 2000: base de datosSi bien es cierto existe una brecha grande Struts y Tiles Ajax Servicios webs con Axisentre los elementos que intervienen en el Servidor de aplicaciones JBossanálisis y desarrollo de las aplicaciones de Diferentes patrones de diseño comolos proyectos que actualmente están Delegate, DAO, DTO, fachade, etc.utilizando el paradigma orientados aobjetos, esto aun se ve aplazado por unancla el cual es la base de datos de tiporelacional, sin embargo en la actualidad este B. Desarrollo e implementación detrabajo de conexión y manipulación de aplicación comercial (ERP) en Web,información de la base de datos ya no es tan orientada a resolver la toma detediosa gracias a la aparición de Hibernate, decisiones en todas las actividades de lade la cual toda aplicación Web hecha en empresa: Comercialización,Java que necesite interactuar con la base de Abastecimiento, Finanzas, Costos,datos puede hacer uso, lo cual simplifica Producción, Contabilidad,enormemente la programación de lógica. Presupuestos, Distribución, y control de Gestión (administrativa, contable,4.0 CASOS DE ÉXITO presupuestaria, entre otras). Tecnología Utilizada: Oracle AplicationA. Adding Technology ha colaborado, Server10g–iDS 10g–Oracle Server 10g. por mediación de acuerdos firmados con Soluziona, en el diseño y posterior desarrollo de la intranet corporativa de Feria de Muestras de Valencia. C. Bunge Argentina S.A Se decide implantar un sistema que sea Workflow de usuarios: Desarrollo de capaz de simplificar todas las tareas workflow para la gestión de usuarios y 9
    • Persistencia Hibernate permisos de los diferentes ambientes de Hibernate podremos cubrir de manera los sistemas de la organización sencilla y rápida el 80 - 90% de la Workflow de Ajuste de Stock: persistencia de nuestra aplicación. Esto nos Desarrollo de workflow para la gestión permite centrar nuestros esfuerzos en de Ajustes de Stock y Transferencias en optimizar las consultas que realmente lo y entre Plantas de productos merecen. Tecnología Utilizada: Oracle9i - J2EE - * En cuanto al manejo de consultas Hibernate - JBoss - Oracle Workflow. Hibernate saca una ligera ventaja ya que tiene su propio lenguaje “HQL” que lo hace multi – motor de base de datos, eso es uno de los atractivos de Hibernate. * Hibernate soporta la mayoría de los5.0 CONCLUSIONES Y sistemas de bases de datos SQL. ElRECOMENDACIONES Hibernate Query Language, diseñado como* Utilizar un framework de ORM una extensión mínima, orientada a objetos,simplifica enormemente la programación de de SQL, proporciona un puente elegantelógica de persistencia. Se trata de una idea entre los mundos objeto y relacional.completamente madura que cada vez se Hibernate ofrece facilidades paravuelve más popular. Nuestra lógica de recuperación y actualización de datos,negocios trabaja contra un modelo de control de transacciones, repositorios dedominio completamente orientado a conexiones a bases de datos, consultasobjetos. Generamos entre un 30% y un 40% programáticas y declarativas, y un controlmenos de código y el tipo de código de relaciones de entidades declarativas.generado es mucho más sencillo y * Hibernate es una muy buena herramientamantenible. en lo que se refiere a mapeo clases en una* Es fundamental conocer bien como base de datos relacional, pero en lo que sefuncionan las tecnologías que utilizamos. refiere al manejo de transacciones yEn el caso de Hibernate hemos visto que conexiones le falta funcionalidad ydependiendo de como hagamos las cosas capacidad.puede afectar directamente al rendimiento * Hibernate es menos invasivo que otrosde la aplicación. marcos de trabajo de mapeo O/R. SeEsto no quiere decir que no debamos usar utilizan Reflection y la generación deHibernate, al contrario, Hibernate nos bytecodes en tiempo de ejecución, y laproporciona grandes beneficios como es la generación del SQL ocurre en el momentoindependencia de la base de datos, bajo de la arrancada. Esto nos permiteacoplamiento entre negocio y persistencia, desarrollar objetos persistentes siguiendo ely un desarrollo rápido, ya que con 10
    • Persistencia Hibernatelenguaje común de Java: incluyendoasociación, herencia, polimorfismo,composición y el marco de trabajoCollections de Java. 11