SlideShare una empresa de Scribd logo
Sistemas de persistencia (orm)hibernate 3.2Licensed under Creative Commons Attribution 3
GuiónTeoríaPrácticaIntroducciónElementos principalesLibreríasCompatibilidadDiagramas de ArquitecturaClases persistentesUtilizaciónOperaciones CRUDTransaccionesHQLCacheHibernate y SpringInstalacionEjemplo simpleHibernate toolsEjemplo completo
Parte   teóricaHibernate   3.2
1.- IntroducciónJDBC es laborioso y muy dependiente de la estructura de datos.Lo mas natural en desarrollo con lenguajes OO es utilizar objetos, lamentablemente las BBDD orientadas a objetos aún no adquieren suficiente madurez.La solución mas adecuada a estos problemas es usar sistemas de persistencia que abstraigan a los desarrolladores del conocimiento de sentencias SQL, los cuales traducen objetos a registros y vice-versa.Internamente utiliza reflexión, lo cual permite a un objeto examinarse y manipularse en tiempo de ejecución.
1.- IntroducciónJavaObjectSQL Tableint id;String name;String getName()intgetId()void setName(String)void setId(int)id [int] primary key,name [varchar(50)]La función de un O/R MappertienelugaraquíDos paradigmas muy diferentesObjetos, atributos, asociaciones con otros objetos, herencia, UML …Columnas, claves ajenas, consultas lenguaje SQL
1.- IntroducciónEs una potente herramienta que permite controlar la persistencia de nuestras aplicaciones contra cualquier base de datos, encapsulando la persistencia de objetos Java a bases de datos relacionales.Existen otras soluciones alternativas a Hibernate pero esta es una de las mas completas y con una amplia difusión en el desarrollo Java.Hibernate realiza automáticamente la inserción y recuperación en base de datos de cualquier objeto Java, haciendo transparente todo el proceso de conexión y las consultas SQL necesarias para insertar, actulizar, eliminar o recuperar la información.También permite manejar colecciones de objetos Java como ArrayList, Vector, Hashtable, Collection, Set y Map.¿Qué es?
1.- IntroducciónHibernate es un motor de persistencia de código abierto que nos facilitará tareas como recuperar, guardar, modificar o eliminar objetos en una base de datos relacional.session.get(string tipo,id);|session.load(string tipo,id);session.save(miObjeto);session.saveOrUpdate(miObjeto);session.delete(miObjeto);Se configura mediante un archivo de configuración hibernate.properties ó hibernate.cfg.xml donde se definen los objetos con sus equivalencias en base de datos.En el archivo de configuración se asocia una Clase a una Tabla y cada Propiedad de la clase a una Columna de dicha tabla.¿Qué es?
1.- IntroducciónResumen  de  característicasReduce el código a escribirFácil modelo de programación (POJO)Tiene estrategias avanzadas de cache (L1 y L2)Optimiza las SQL (nunca actualiza datos vacios)Tiene estrategias de carga perezosasDa  independencia y abstracción sobre los proveedores de base de datosMapea relaciones de tipos de objetos (one-to-one, one-to-many, many-to-many)Provee objetos desconectadosTiene soporte completo para JTATiene excelente integración con Spring
2.- Elementos principalesModeloClases a persistirHan de seguir las especificaciones JavaBeansArchivo de mapeoRelaciona el objeto a persistir co nuna entidad de la base de datosArchivo de configuraciónSe configura por ficheros de configuración en los cuales se indicaOrigen de datosTransaccionesetcDAOClase que aglomera todo el tratamiento de la persistencia
3.- Libreríasswarmcache-1.0rc2.jar (1.0rc2)runtime, optionaljboss-cache.jar (1.2.2 alpha)TreeCache clustered cache- runtime, optionaljgroups-2.2.8.jar (2.2.8)JGroups multicast libraryruntime, optional (required by replicated caches)jta.jar Standard JTA APIruntime, required for standalone operation (outside application server)xml-apis.jar Standard JAXP APIruntime, some SAX parser is requiredcommons-logging-1.0.4.jar (1.0.4)Commons Loggingruntime, requiredc3p0-0.9.1.jar (0.9.1)C3P0 JDBC connection pool runtime, optional (needed if using c3p0 as the connection pooling library)jboss-system.jar runtime, optional (required by TreeCache)
3.- Libreriasasm-attrs.jar (unknown)ASM bytecode libraryruntime, required if using 'cglib' bytecode providerjacc-1_0-fr.jar (1.0-fr)JACC Libraryruntime, optionalcheckstyle-all.jar CheckstyleBuildtimelog4j-1.2.11.jar (1.2.11)Log4j Libraryruntime, optionaljunit-3.8.1.jar (3.8.1)JUnit test frameworkbuildtimejavassist.jar (3.4)Javassist bytecode generatorruntime, required if using 'javassist' bytecode providerdom4j-1.6.1.jar (1.6.1)XML configuration & mapping parserruntime, requiredantlr-2.7.6.jar (2.7.6)ANother Tool for Language Recognitionruntime, requiredcglib-2.1.3.jar (2.1.3)CGLIB bytecode generatorruntime, required if using 'cglib' bytecode providerjboss-common.jar runtime, optional (required by TreeCache)
3.- Libreriasoscache-2.1.jar (2.1)OpenSymphony OSCacheruntime, optionalasm.jar ASM bytecode libraryruntime, required if using 'cglib' bytecode providerant-launcher-1.6.5.jar (1.6.5)Ant launcherbuildtimejaas.jar Standard JAAS APIruntime, optional (required by JCA)ant-antlr-1.6.5.jar (1.6.5)Ant antlr supportbuildtimejboss-jmx.jarruntime, optional (required by TreeCache)cleanimports.jarCleanimportsbuildtimexerces-2.6.2.jar (2.6.2)SAX parserruntime, required for JDK < 1.4jaxen-1.1-beta-7.jar (1.1-beta-7)Jaxen - universal java xpath engineruntime, required if you want to deserialize a Configuration to improve startup performanceant-junit-1.6.5.jar (1.6.5)Ant junit supportbuildtime
3.- Libreriasant-swing-1.6.5.jar (1.6.5)Ant swing supportbuildtimecommons-collections-2.1.1.jar (2.1.1)Commons Collectionsruntime, requiredant-1.6.5.jar (1.6.5)Ant core- buildtimeproxool-0.8.3.jar (0.8.3)Proxool JDBC connection pool- runtime, optional (needed if using proxool as the connection pooling library)concurrent-1.3.2.jar (1.3.2)runtime, optional (required by TreeCache)syndiag2.jar (2.0)antlr to bnf image generatorbuildtime
4.- CompatibilidadOracleDB2SysbaseMS SQL ServerMySQLInterbaseInformixFirebirdOtras…Soporta  algunas  bases  de  datos  como
5.- diagrama  de  ArquitecturaArquitectura  multicapasHibernate usa los ficheros de configuración para proporcionar servicios de persistencia a las aplicaciones
5.- diagrama  de  ArquitecturaVista   detallada  de  la  arquitectura  de  Hibernate
5.- diagrama  de  ArquitecturaVista   detallada  de  la  arquitectura  de  Hibernateorg.hibernate.SessionFactoryCache  inmutable de los mapeos compilados para una base de datos.Es una factoria de Session y un cliente de ConnectionProvider.Puede almacenar un segundo nivel de cache de datos rehusables, entre transacciones, procesos o a nivel de cluster.SessionFactory
5.- diagrama  de  ArquitecturaVista   detallada  de  la  arquitectura  de  Hibernateorg.hibernate.SessionEnvuelve una conexión JDBC.Factoria de transaccionseAlmacena el primer nivel de cache para los objetos persistentes cuando son buscados por identificador o mediante queries.Tiene un corto periodo de vida  mientras la aplicación y la DB intercambian información.Session
5.- diagrama  de  ArquitecturaVista   detallada  de  la  arquitectura  de  HibernateLos objetos persistentes y las colecciones.Llamados también POJOS o JavaBeansContienen  el estado los datos persistentesSe asocian únicamente a una Session.Tan pronto como la Session se cierra, estos son  desligados y liberados para ser utilizados en cualquier capa de la aplicación (DTO)Objetos persistentes
5.- diagrama  de  ArquitecturaVista   detallada  de  la  arquitectura  de  HibernateTodos los objetos que involucra  hibernate (clases-tablas) pueden tener tres estados:TransientLa instancia no esta asociada con ningún contexto de persistencia. No tiene identificador de persistencia  (PK).PersistentInstancia asociada a un contexto persistente, su PK tiene valor y puede corresponder con una fila de base de datos.DetachedLa instancia estuvo asociada a un contexto pero este fue cerrado o fue serializada a otro procesoEstados de las instancias de los objetos persistentes
5.- diagrama  de  ArquitecturaVista   detallada  de  la  arquitectura  de  HibernateObjetos transitorios y coleccionesSon instancias de las clases persistentes que no estan asociadas a una Session.Pueden ser instanciadas por la aplicación y no ser persistidas o pueden ser el resultado de un correcto cierre de la sesion (session.close())Objetos transitorios
5.- diagrama  de  ArquitecturaVista   detallada  de  la  arquitectura  de  Hibernateorg.hibernate.Transaction(Opcional) Usado por las aplicaciones para indicar unidades de trabajo atómicas.Abstrae a la aplicación  de las transacciones subjacentes de JDBC, JTA o 	CORBA.Una session puede crear múltiples transacciones en algunos casos.Toda transaccion se ha confirmar o rechazar.Transaction
5.- diagrama  de  ArquitecturaVista   detallada  de  la  arquitectura  de  Hibernateorg.hibernate.connection.ConnectionProvider(Opcional) Factoria de conexiones JDBCAbstrae a la aplicación del uso de DataSource o DriverManager.No esta expuesta para la aplicación, per o los desarrolladores lo pueden extender o implementar.ConnectionProvider
5.- diagrama  de  ArquitecturaVista   detallada  de  la  arquitectura  de  Hibernateorg.hibernate.TransactionFactory(Opcional) Factoria de instancias de transacciones.No esta expuesta para la aplicación, pero los desarrolladores pueden implementarla o extenderla.TransactionFactory
5.- diagrama  de  ArquitecturaAPI  de  Hibernate
Hibernate.cfg.xmlArchivo XML principal de configuración de Hiberntate.Su estructura viene marcada por un fichero descriptivo llamado  hibernate-configuration-3.0.dtdContiene los datos de conexión con la base de datos.Contiene los mapeos a los ficheros descriptivos de las clases persistentes del dominio.
Hibernate.cfg.xmlSessionFactoryPropertyMapping resourceSi la SessionFactory no tiene un nombre se utiliza por defecto a nivel global de la aplicación, si se dispone de varias bases de datos hay que tener un SessionFactory por cada una, en diferentes ficheros de configuración.En las propiedades (Property) se definen los elementos necesarios para establecer las conexiones.Mediante la etiqueta Mapping se señala donde esta el fichero xml con el mapeo entre las clases Java y la tabla de la base de datos enlazada.Principales  etiquetas
Hibernate.cfg.xmlPrincipales  etiquetasLas propiedades (property)hibernate.connection.driver_class : oracle.jdbc.driver.OracleDriverhibernate.connection.username : testhibernate.connection.password : testhibernate.connection.url : jdbc:oracle:thin:@localhost:1521:xehibernate.dialect : org.hibernate.dialect.Oracle10gDialecthibernate.connection.autocommit : trueHibernate.showsql : truehibernate.default_schema : testcache.provider_class : org.hibernate.cache.NoCacheProviderhbm2ddl.auto : createhibernate.use_sql_comments : trueImplemetación particular de SQL que Hibernate generaMuestra las sentencias SQL que Hibernate ejecutaCrea automáticamente el esquema de base de datosDesactiva la cache de segundo nivelGenera comentadios dentro de las sentencias SQL para facilitar la depuración
Hibernate.cfg.xmlPrincipales  dialectos  de  hibernate
Hibernate.cfg.xmlEn el apartado 7 se cubre la forma como se carga la configuración de hibernte con una clase utilitaria llamada HibernateUtil.Todos los nombres de las propiedades que soporta Hibernate estan definidos en org.hibernate.cfg.EnvironmentUtilización  y  carga
6.- Las  clases  persistentesSon las clases del modelo que se guardan en la base de datos y se pueden recuperar. Usualmente denominadas POJO(Plain Old Java Object)Toda clase persistente tiene un fichero descriptivo .hbm, el cual describe el mapeo entre la clase y la tabla de la base de datos asociada., Asi como parametros de actualización en cascada, composición del método ToString, y otros.
6.- Las  clases  persistentesHan de cumplir una serie de requisitos:Métodos get y set para cada atributo de la clase.Constructor por defecto sin argumentos para que hibernate pueda instanciarla.Atributo identificador, en la clase persona el atributo id es el identificador de la clase y la PK de la tabla correspondiente.Es recomendable implementar los métodos equals() y hashcode().Interfaz Lifecycle.- de forma opcional una clase persistente puede implementar esta interfaz, la cual permite ejecutar acciones después de alguna operación
6.- Las  clases  persistentesLas clases persistentes pueden implementar esta interfaz de manera opcional.Proporciona callbacks desde la session hacia el objeto persistente.onSave .- invocado antes que el objeto sea almacenado. onUpdate .- Invocado antes que el objeto sea actualizado.onDelete .-  Invocado antes que el objeto sea eliminado.onLoad .- invocado después que el objeto sea cargado de la base de datos.Interfaz  Lifecycle
6.- Las  clases  persistentesEn aplicaciones reales se dan estructuras complicadas de base de datos, existiendo a veces múltiple dependencias entre objetos y diversas restricciones de integridad.Los ficheros de mapeo dan cobertura a los requisitos mencionados anteriormente mediante etiquetas que definen diversos tipos de clases como colecciones de objetos, herencias o clases persistentes cuyos atributos son otras clases persistentes.Mapeo  de  las  clases
6.- Las  clases  persistentesMapeo de tipos de datosMapeo  de  las  clases
6.- Las  clases  persistentesEjemplo  de  clase  mapeada    -    Categoria.hbm.xml<hibernate-mapping>    <class name="edu.training.hibernate.Categoria" table="CATEGORIA">        <id name="idCategoria" type="big_decimal">            <column name="ID_CATEGORIA" precision="22" scale="0" />            <generator class="assigned" />        </id>        <property name="nombre" type="string">            <column name="NOMBRE" length="100" />        </property>        <set name="productos" inverse="true">            <key>                <column name="ID_CATEGORIA" precision="22" scale="0" />            </key>            <one-to-many class="edu.training.hibernate.Producto" />        </set>    </class></hibernate-mapping>El generador de claves primarias además de ser asignado manualmenete, tambien se puede establecer mediante una secuence:<generatorclass="sequence">       <param name="sequence">SEQ_de_oracle</param></generator>Aunque tambien una clase personalizada que implemente de  org.hibernate.id.IdentifierGenerator<generatorclass="edu.training.hibernate.generator.CustomGenerator">
6.- Las  clases  persistentesEjemplo  de  clase  mapeada    -    Categoria.javapublic class Categoria implements java.io.Serializable {    private BigDecimal idCategoria;    private String nombre;    private Set<Producto> productos = new HashSet<Producto>(0);    public Categoria() {    }    public Categoria(BigDecimal idCategoria) {	this.idCategoria = idCategoria;    }    public Categoria(BigDecimal idCategoria, String nombre,		Set<Producto> productos) {	this.idCategoria = idCategoria;	this.nombre = nombre;	this.productos = productos;    }
6.- Las  clases  persistentesEjemplo  de  clase  mapeada    -    Categoria.java public BigDecimal getIdCategoria() {	return this.idCategoria;    }    public void setIdCategoria(BigDecimal idCategoria) {	this.idCategoria = idCategoria;    }    public String getNombre() {	return this.nombre;    }    public void setNombre(String nombre) {	this.nombre = nombre;    }    public Set<Producto> getProductos() {	return this.productos;    }    public void setProductos(Set<Producto> productos) {	this.productos = productos;    }}
6.- Las  clases  persistentesRestricciones de seguridad<Many-to-one>: Utilizada para definir relaciones de muchos a uno, como por ejemplo varios productos que pertenecen a un único pedido.<One-to-Many>: Es el caso contrario al anterior, en el fichero de mapeo de la clase pedido se podrá indicar que este puede contener varios productos.<One-to-one>: Para definir relaciones uno a uno y se utiliza para tablas que compartan la clave primaria o para referencias a una clave foránea.Mapeo  de  las  clases
6.- Las  clases  persistentesColecciones de objetosHibernate puede tratar instancias de:Map, Set, SortedMap, SortedSet, List, Cualquier array de objetos persistentes.Las etiquetas que pueden mapear esto son: <map>, <set>, <list>, <bag>, <array> y <primitive-array>Mapeo  de  las  clases
6.- Las  clases  persistentesLa Herencia, en Hibernate es abordada de tres formas distintas.La más elegante es usar la misma tabla para almacenar los datos de las distintas clases de la misma familiaSe puede observar que de la clase Perro heredan dos clases hijas que serian Mastin y Bulldog, esto se hace con la etiqueta <subclass>.Mapeo  de  las  clases
6.- Las  clases  persistentesLa Herencia, en Hibernate es abordada de tres formas distintas.La segunda forma de herencia es guardar los datos de una subclase en otra tabla distinta sustituyendo la etiqueta <subclass>.La tercera forma es definir la herencia con una etiqueta class para cada clase de la familia, con lo que se guardarían en tablas independientes, sin ninguna relación entre ellas.Mapeo  de  las  clases
7.- utilizaciónLo primero que se deberíamos hacer para utilizar Hibernate es crear un objeto Configuration para indicarle donde esta el archivo de configuración.Configuration cfg = new Configuration();cfg.configure(“…\hibernate.cfg.xml”);Ahora deberiamos abrir una sesión en Hibernate con el SessionFactory.SessionFactory sessionFactory = cfg.buildSessionFactory();Session session = sessionFactory.openSession();Una session representa una conexión con la base de datos, es recomendable tener una clase que se especialice en  darnos acceso  de forma conveniente al SessionFactoryCarga  de  configuración  y  el  SessionFactory
7.- utilizaciónHibernateUtilpublicclassHibernateUtil {privatestatic final SessionFactorysessionFactory;static {        try {sessionFactory = new Configuration().configure().buildSessionFactory();        } catch (Throwable ex) {            // Makesureyou log theexception, as itmight be swallowedSystem.err.println("InitialSessionFactorycreationfailed." + ex);throw new ExceptionInInitializerError(ex);        } }publicstaticSessionFactorygetSessionFactory() {returnsessionFactory;    }}
7.- utilizaciónCarga  de  un  SessionFactory   desde  JNDIprivate final SessionFactorysessionFactory = getSessionFactory();protectedSessionFactorygetSessionFactory() {    try {return (SessionFactory) new InitialContext().lookup("SessionFactory");    } catch (Exception e) {log.error("CouldnotlocateSessionFactory in JNDI", e);throw new IllegalStateException(                     "CouldnotlocateSessionFactory in JNDI");    }}
8.- carga  de  objetos  por  su  idCRUD	Para recuperar un objeto de la base de datos el objeto session dispone de los métodos load y get.Solo se debe utilizar load si se esta seguro que el objeto existe.El método get devuelve la instancia de un objeto o null si esta no existe.public Usuario findById(java.math.BigDecimalid) {log.debug("getting Usuario instancewith id: " + id);	try {		Usuario instance = (Usuario) sessionFactory.getCurrentSession().get("edu.training.hibernate.Usuario", id);if (instance == null) {log.debug("getsuccessful, no instancefound");		} else {log.debug("getsuccessful, instancefound");		}returninstance;…………..
8.- nuevos objetos  persistentesCRUD	Para almacenar todos los objetos de nueva creación en la base de datos es necesario invocar el método save del objeto session.Usuario usr = new Usuario();usr.setApellidos("apellidos hibernate");usr.setNombre("nombre hibernate");usr.setPassword("password");usr.setTipo("admin2");usr.setUsuario("hib@hib.org2");ses.save(usr);
8.- búsqueda  de  objetosUso de criterios de búsqueda	La clase org.hibernate.Criteria, esta es un API para recuperar entidades mediante la composición de criterios  y que es capaz de devolver múltiples resultados.publicList<Usuario> findByExample(Usuario instance) {log.debug("finding Usuario instancebyexample");	try {Criteriacriterio = sessionFactory	   .getCurrentSession().createCriteria("edu.training.hibernate.Usuario");criterio.add(create(instance));List<Usuario> results = (List<Usuario>) criterio.list();log.debug("findbyexamplesuccessful, resultsize: "+ results.size());returnresults;	} catch (RuntimeException re) {} …………..
8.- búsqueda  de  objetosUso de criterios de búsqueda	Listcats = session.createCriteria(Cat.class)     .add( Restrictions.like("name", "Iz%") )     .add( Restrictions.gt( "weight", new Float(minWeight) ) )     .addOrder( Order.asc("age") )     .list();
8.- Actualización  de  objetosLa actualización de la base de datos se puede hacer de dos formas distintasLa primera mediante el método flush del objeto session. Este método hace que se actualice en la base de datos que estén en memoria en el estado actual. Se recomienda su uso antes de :Hacer un commitCerrar una sessionDependiendo del parametro flush-mode, Transaction.commit()  llama al método flush.La otra forma es utilizando el método saveOrUpdate, el cual graba un objeto nuevo o lo actualiza, dependiendo del valor almacenado en unsaved-value.Esta operación se lanza en cascada en sus instancias asociadas si en el fichero de mapeo se encuentra cascade="save-update".CRUD
8.- Actualización  de  objetosCRUD	publicvoidattachDirty(Usuario instance) {log.debug("attachingdirty Usuario instance");	try {sessionFactory.getCurrentSession().saveOrUpdate(instance);log.debug("attachsuccessful");	} catch (RuntimeException re) {log.error("attachfailed", re);throw re;	}}
8.- Borrado  de  objetosCRUD	Para eliminar un objeto existe el método delete del objeto session.También es posible eliminar varios objetos con una sola llamada al método delete pasándole una query.publicvoiddelete(Usuario persistentInstance) {log.debug("deleting Usuario instance");	try {sessionFactory.getCurrentSession().delete(persistentInstance);log.debug("deletesuccessful");	} catch (RuntimeException re) {log.error("deletefailed", re);throw re;	}}
8.- Sincronización  de  datosCRUD  -  session.flush()	Llegado el momento en que la session ha ejecutar las sentencias SQL y volcar el estado de los objetos en la base de datos, la session dispone de un método llamado flush, el cual se encarga de hacer esto.El proceso de flush ocurre por defecto en los siguientes puntos:Antes de la ejecución de las queriesDesde el commit de una transaccionDesde session.flush()Las sentencias SQL son ejecutadas en el siguiente orden:Todos los inserts en el orden en el que hayan sido guardados (session.save())Todas las actualizacionesTodas las sentencias de borrado
9.- TransaccionesHibernate utiliza directamente conexiones JDBC y recursos JTA sin añadir comportamientos adicionales de bloqueo.Hibernate no bloquea los objetos en memoria.Mediante el objeto Session, Hibernate proporciona multiples lecturas de objetos por su identificador y las queries de entidades.El objeto SessionFactory es costoso de crear, pero puede ser compartido por todos los threads de la aplicación, este suele ser creado una vez cuando la aplicación se inicia desde una instancia del objeto Configuration.Transacciones  y  concurrencia
9.- TransaccionesUna Session no es cara de crear (no es threadsafe), se suele utilizar en una petición o unidad de trabajo y posteriormente es descatado y sobre todo no obtiene una conexión JDBC hasta que no es realmente necesario.Una transaccion ha de durar lo menos posible para reducir la contención de bloqueo en la base de datos.Las transacciones de periodos muy largos pueden impedir que la aplicación escale durante una  fuerte carga de concurrencia.Transacciones  y  concurrencia
9.- TransaccionesTransaction tx = session.beginTransaction(); tx.commit(); tx.rollback(); Transaction
9.- TransaccionesEjemplo  simple  de  Transactionpublicstaticvoidmain(String[] args) {Configurationcfg = new Configuration();SessionFactoryfactory = cfg.configure().buildSessionFactory();Sessionsession = factory.openSession();Transactiontx = session.beginTransaction();Messagesmessage = new Messages();message.setMessageText(“HelloWorld);session.save(message);tx.commit();}
10.- hibernatequerylanguageSQL orientado a objetosClases y atributos vs. Tablas y columnasAsociaciones, polimorfismoSoporta operaciones relacionalesProyección, agregación, gruposSubconsultasFunciones SQLHQL
10.- hibernatequerylanguageLenguaje de consultas de Hibernate similar al SQL, pero orientado a objetos. Ej.:from paquete.PersonaLa cláusula select es opcional, es necesario indicar el paquete al que pertenece la clase, por que en las consultas es el nombre de las clases el que se utiliza y NO el de la tabla de base de datos.En la cláusula select hay que hacer referencia a los atributos de la clase, ya que es la propia clase la que es referenciada en la consulta y NO la tabla en la que se almacena.Select per.nombre from paquete.Persona perComo en SQL se pueden usar alias en los nombres de las tablas.HQL
10.- hibernatequerylanguageCuenta con las típicas funciones matemáticas que se pueden utilizar.El polimorfismo en las consultas se trata de una manera muy sencilla, si se hace una consulta sobre una clase, también se devolverán sus subclasesfrom java.lang.Object oEsta consulta devolverá todos los objetos persistentes.HQL
10.- hibernatequerylanguageLa cláusula where, es muy similar a la de SQL. La ventaja es que se pueden referenciar los atributos de la clase que se consulte, incluso si es un array.Los operadores habituales disponibles son : =, >=, <=, <>, ¡=, like.HQL
10.- hibernatequerylanguageEl resto de cláusulas típicas de SQL tambien se pueden utilizar en HQL como:group byhavingorder byEtc...HQL
10.- Consultas  hqlMétodosCuando no se conoce el identificador de los objetos a cargar, Hibernate nos proporciona un mecanismo de consultas para ubicarlos y cargarlos desde la base de datos.Este mecanismo se conoce como HQL, el cual permite hacer consultas directamente sobre las clases java.El método createQuery (String consulta) del objeto session permite crear consultas HQL, para luego invocar al método list().Las consultas tambien se pueden expresar en SQL nativo con el soporte de Hiberntate para convertir el conjunto de resultados en objetos Java.Las consultas HQL y el SQL nativo se representa con una instancia de org.hibernate.Query, este ofrece métodos para enlazar parametros, manejo de resultados y ejecución de la query asociada.
10.- Consultas  hqlMétodosPara poder controlar los resultados que devuelve una consulta, como puede ser el número máximo de filas o la primera fila que se debe devolver, se puede crear una instancia de la clase Query.Como se aprecia hay diferentes maneras de recuperar los datos de las tablas con Hibernate, sin utilizar SQL, de todas maneras es posible realizar consultas en SQL nativo, si así se desea.
10.- Consultas  hqlConsultas  con  parámetros Query q = session.createQuery("from Categoria where nombre like :pnombre order by nombre desc");q.setString("pnombre", "%ad%");List<Categoria> results = (List<Categoria>) q.list();System.out.println("resultados devueltos : " + results.size());if(results.size() > 0 ){	for(Categoria c : results){		System.out.println("Id     : " + c.getIdCategoria());		System.out.println("Nombre : " + c.getNombre());	}}
10.- Consultas  hqlResultados escalaresIterator results = sess.createQuery("select cat.color, min(cat.birthdate), count(cat) from Cat cat " +        "group by cat.color")        .list()        .iterator();while ( results.hasNext() ) {    Object[] row = (Object[]) results.next();Color type = (Color) row[0];Date oldest = (Date) row[1];Integer count = (Integer) row[2];    .....}
10.- Consultas  hqlFiltrado  por  conjunto  de  valores//named parameter listList names = new ArrayList();names.add("Izi");names.add("Fritz");Query q = sess.createQuery("from DomesticCat cat where cat.name in (:namesList)");q.setParameterList("namesList", names);List cats = q.list();
10.- Consultas  sql NativasExternalización   de  consultas  en  ficherosSe pueden definir consultas HQL y almacenarlas en un fichero asignandoles un nombre a cada una de ellas y estableciendo el mapping dentro del Hibernte.cfg.xml como si fuera el mapeo de una clase.<hibernate-mapping><query name="CategoriasPorNombre"><![CDATA[from Categoria where nombre like :pnombre order by nombredesc]]></query></hibernate-mapping>Query q = session.getNamedQuery("CategoriasPorNombre");q.setString("pnombre", "%ad%");List<Categoria> results = (List<Categoria>) q.list();
10.- Consultas  nativas  sqlcreateSQLQuerySe pueden definir consultas HQL y almacenarlas en un fichero asignandoles un nombre a cada una de ellas y estableciendo el mapping dentro del Hibernte.cfg.xml como si fuera el mapeo de una clase.Las consultas sql tambien pueden ser externalizadas y tener parametros.Listcats = session.createSQLQuery(    "SELECT {cat}.ID AS {cat.id},        {cat}.SEX AS {cat.sex}, " +           "{cat}.MATE AS {cat.mate},    {cat}.SUBCLASS AS {cat.class}, ... " +    "FROM CAT {cat} WHERE ROWNUM<10",    "cat",Cat.class).list()
11.- cachéLa caché es un mecanismo que nos permite almacenar nuestras estructuras de datos en memoria, evitándonos volver a buscar nuevamente los datos en la BBDD que además se puede compartir con otros sistemas.El usuario consultaSi la aplicación la tiene en caché se devuelven los datos directamente.Si la aplicación NO la tiene la recupera de la fuente de datos asociada, la almacena en caché y devuelve los datos.Presenta problemas de inconsistencia de datos cuando hay mas de una caché con los mismos datos cargados ya que podrían cambiar sin que una de las caches se entere.
11.- cachéOfrece una caché de dos niveles (L1 y L2), donde solo el primero es obligatorio.También incluye una caché de consultas, pudiendo obtener rápidamente resultados que hayan sido consultados previamente.
PresentaciónInterpretaciónServiciosSpring FrameworkIoC, AOPIntegración12.- hibernate   y   springArquitectura  de  aplicaciones  Spring  con  HibernateJSP/ JSF / Struts / Spring MVCManagers – Classes JavaOrientación a AspectosServices – Classes JavaHibernateWrappersJAASPL/SQLLDAPRelationalDDBB
12.- hibernate   y   springDiseño  Spring  con  HibernateManager / Delegate<<interfaz>>ServiceService  ImplSpring<<interfaz>>DAOHibernateDaoSupportDAO ImplModelo / POJOsFicheros de mappingHibernate
12.- hibernate   y   springAdministra la SessionFactory y la Session.Administración declarativa de transacciones en contenedores ligeros.Fácil de testear (se puede añadir una SessionFactory vía ficheros XML)Pocas lineas de código (enfocado más en el negocio)Modulo  Spring  ORM  :  Soporte  para  Hibernate
12.- hibernate   y   springHibernateTemplateProporcionado por SpringHibernate AOPLos DAO necesitan extender de HibernateDAOSupportLos métodos de los DAO son limpiosTransactionTemplatePermite la ejecución de código transaccional sin necesidad de re-implementar los workflowsEjecuta rollbacks si los callbacks originan alguna excepciónTransactionInterceptorLos bussines objects no necesitan ser conscientes de las transacciones.Soporta excepciones checked y uncheckedModulo  Spring  ORM  :  Soporte  para  Hibernate
12.- hibernate   y   springSession session =    HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();try{    session.saveOrUpdate(timesheet);    session.getTransaction().commit();}catch (HibernateException e){    session.getTransaction().rollback();    throw e;}getHibernateTemplate().saveOrUpdate(timesheet);Modulo  Spring  ORM  :  Soporte  para  Hibernate
13.- LoggingModo Debug activado
Parte   prácticahibernate  3.2
InstalaciónTenemos que descargarlo de http://www.hibernate.org/Hay que colocar sus JARs dentro del directorio LIB de nuestra aplicación.Los ficheros de configuración de cada clase deben ir acompañando a sus fuentes (src\...\...)Debemos colocar el fichero de configuración de Hibernate hibernate.cfg.xml en la raíz del directorio src
Utilización  –  Ejemplo  simplePasosCrear una tabla en la base de datosClase equivalente en código javaCrear el fichero de mapeo, los cuales indican la correspondencia entre los atributos de la clase y los de la tabla de la base de datos.Código Java de utilización del API de Hibernate.
Utilización  –  Ejemplo  simpleCreación de la tabla en la base de datos.CREATE TABLE persona (id VARCHAR(32) NOT NULL PRIMARY KEY, edad INTEGER NOT NULL, nombre VARCHAR(255) NOT NULL);
Utilización  –  Ejemplo  simpleLa clase persistente
Utilización  –  Ejemplo  simpleFichero de mapeo Persona.hbm.xml, ubicado en el mismo directorio que la clase compilada.
Utilización  –  Ejemplo  simpleCódigo Java de utilización del API de HibernateInsertando en la base de datos Recuperando un objeto por su identificador
Jboss ide   -   hibernate   toolsUna herramienta útil para hacer proyectos Hibernate es Hibernate-Tools, que viene incorporada dentro de JBossIDEEl update-site de eclipse es:http://download.jboss.org/jbosstools/updates/stable/Diapositivas con un el desarrollo de un proyecto de persistencia.
- FIN -Licensed under Creative Commons Attribution 3

Más contenido relacionado

PDF
Manual hibernate v2
PPSX
Persistencia De Objetos(Hibernate)
PDF
Bases de Datos en Java - Intro a Hibernate
PDF
Hibernate - JPA @luce 5
DOCX
Java persitence api
PDF
Persistencia de datos en Java
PPTX
Persistencia jpa
PDF
Persistencia en Java - Serialización
Manual hibernate v2
Persistencia De Objetos(Hibernate)
Bases de Datos en Java - Intro a Hibernate
Hibernate - JPA @luce 5
Java persitence api
Persistencia de datos en Java
Persistencia jpa
Persistencia en Java - Serialización

La actualidad más candente (20)

PDF
Mecanismos de Persistencia en Android
PPTX
Hibernate framework
PDF
Introduccion a Doctrine 2 ORM
PPT
PERSISTENCIA BASADA EN ARCHIVOS
PDF
Orm presentación final
PPT
Java y Bases de Datos
PPTX
Java con base de datos
PPT
Conceptos de hibernate
PPT
Persistence
PDF
3. Curso Java JDBC (Bases de datos) - Curso 2005-2006
PPT
PPTX
Spring community day 2010
PDF
Persistencia de datos
PDF
Tema 15 aplicaciones de dos capas por gio
PPT
JAVA CON BASE DE DATOS
PDF
Integración de aplicaciones Java
PPT
Bases de Datos en en www.fiec.espol.edu.ec
PDF
Hibernate - JPA @luce 4
PPT
Bases Datos en java
PPT
Java y Bases Datos
Mecanismos de Persistencia en Android
Hibernate framework
Introduccion a Doctrine 2 ORM
PERSISTENCIA BASADA EN ARCHIVOS
Orm presentación final
Java y Bases de Datos
Java con base de datos
Conceptos de hibernate
Persistence
3. Curso Java JDBC (Bases de datos) - Curso 2005-2006
Spring community day 2010
Persistencia de datos
Tema 15 aplicaciones de dos capas por gio
JAVA CON BASE DE DATOS
Integración de aplicaciones Java
Bases de Datos en en www.fiec.espol.edu.ec
Hibernate - JPA @luce 4
Bases Datos en java
Java y Bases Datos
Publicidad

Destacado (9)

PPT
JEE 5 - EJB3
PPTX
WSO2 DSS - JENKINS
PPTX
WS02 ESB Service Chaining
PPSX
Persistencia de objetos con Hibernate
PPTX
WSO2 Transformer Proxy
PPTX
WSO2 DSS - Calling stored procedures with cursors
PPTX
WSO2 REST API Example
PPTX
WSO2 DSS - Create a Data service
PPTX
WSO2 API Manager - Accessing SOAP Service
JEE 5 - EJB3
WSO2 DSS - JENKINS
WS02 ESB Service Chaining
Persistencia de objetos con Hibernate
WSO2 Transformer Proxy
WSO2 DSS - Calling stored procedures with cursors
WSO2 REST API Example
WSO2 DSS - Create a Data service
WSO2 API Manager - Accessing SOAP Service
Publicidad

Similar a Hibernate 3.2 short manual (20)

PDF
Sesion03 apuntes
PDF
Manual hibernate
PPT
Persistencia de datos_hibernate_arquitecturas_de_software
DOC
Hibernate
PDF
Hibernate - JPA @luce
PDF
06 - HIBERNATE sistema de informacion 1.pdf
PDF
Motor de persistencia nhibernate
PDF
Hibernate reference
PPT
Spring ORM
PDF
Hibernate - Introducción
PPT
Persistencia de un modelo de objetos
ODT
PPTX
Jpa vs hibernate
PPTX
Curso Spring 3 + Hibernate
PPTX
Orm hibernate springframework
PPTX
P2C2 Introducción a JEE5
PPTX
Hibernate framework
PDF
Presentacion mvc orm
Sesion03 apuntes
Manual hibernate
Persistencia de datos_hibernate_arquitecturas_de_software
Hibernate
Hibernate - JPA @luce
06 - HIBERNATE sistema de informacion 1.pdf
Motor de persistencia nhibernate
Hibernate reference
Spring ORM
Hibernate - Introducción
Persistencia de un modelo de objetos
Jpa vs hibernate
Curso Spring 3 + Hibernate
Orm hibernate springframework
P2C2 Introducción a JEE5
Hibernate framework
Presentacion mvc orm

Más de Emmerson Miranda (6)

PPTX
WSO2 ESB - Acceso a base de datos
PPSX
Prototipado de pantallas para toma de requisitos
PPTX
Json short manual
PPTX
Modelado de aplicaciones en UML con EA
PPTX
Log4j 1.2.15 Short Manual
PPT
Arquitectura Mashup Con SilverLight 2
WSO2 ESB - Acceso a base de datos
Prototipado de pantallas para toma de requisitos
Json short manual
Modelado de aplicaciones en UML con EA
Log4j 1.2.15 Short Manual
Arquitectura Mashup Con SilverLight 2

Último (20)

PDF
SAP Transportation Management para LSP, TM140 Col18
PPTX
Presentación de Redes de Datos modelo osi
PDF
Plantilla para Diseño de Narrativas Transmedia.pdf
PDF
taller de informática - LEY DE OHM
PDF
Diapositiva proyecto de vida, materia catedra
PDF
Estrategia de apoyo tecnología miguel angel solis
PPTX
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
DOCX
Zarate Quispe Alex aldayir aplicaciones de internet .docx
PPTX
historia_web de la creacion de un navegador_presentacion.pptx
PPTX
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
PPTX
Power Point Nicolás Carrasco (disertación Roblox).pptx
PPTX
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
PDF
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
PDF
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
PPTX
REDES INFORMATICAS REDES INFORMATICAS.pptx
PDF
Maste clas de estructura metálica y arquitectura
PDF
Influencia-del-uso-de-redes-sociales.pdf
PDF
Calidad desde el Docente y la mejora continua .pdf
PPTX
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
PDF
Estrategia de apoyo tecnología grado 9-3
SAP Transportation Management para LSP, TM140 Col18
Presentación de Redes de Datos modelo osi
Plantilla para Diseño de Narrativas Transmedia.pdf
taller de informática - LEY DE OHM
Diapositiva proyecto de vida, materia catedra
Estrategia de apoyo tecnología miguel angel solis
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Zarate Quispe Alex aldayir aplicaciones de internet .docx
historia_web de la creacion de un navegador_presentacion.pptx
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
Power Point Nicolás Carrasco (disertación Roblox).pptx
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
REDES INFORMATICAS REDES INFORMATICAS.pptx
Maste clas de estructura metálica y arquitectura
Influencia-del-uso-de-redes-sociales.pdf
Calidad desde el Docente y la mejora continua .pdf
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
Estrategia de apoyo tecnología grado 9-3

Hibernate 3.2 short manual

  • 1. Sistemas de persistencia (orm)hibernate 3.2Licensed under Creative Commons Attribution 3
  • 2. GuiónTeoríaPrácticaIntroducciónElementos principalesLibreríasCompatibilidadDiagramas de ArquitecturaClases persistentesUtilizaciónOperaciones CRUDTransaccionesHQLCacheHibernate y SpringInstalacionEjemplo simpleHibernate toolsEjemplo completo
  • 3. Parte teóricaHibernate 3.2
  • 4. 1.- IntroducciónJDBC es laborioso y muy dependiente de la estructura de datos.Lo mas natural en desarrollo con lenguajes OO es utilizar objetos, lamentablemente las BBDD orientadas a objetos aún no adquieren suficiente madurez.La solución mas adecuada a estos problemas es usar sistemas de persistencia que abstraigan a los desarrolladores del conocimiento de sentencias SQL, los cuales traducen objetos a registros y vice-versa.Internamente utiliza reflexión, lo cual permite a un objeto examinarse y manipularse en tiempo de ejecución.
  • 5. 1.- IntroducciónJavaObjectSQL Tableint id;String name;String getName()intgetId()void setName(String)void setId(int)id [int] primary key,name [varchar(50)]La función de un O/R MappertienelugaraquíDos paradigmas muy diferentesObjetos, atributos, asociaciones con otros objetos, herencia, UML …Columnas, claves ajenas, consultas lenguaje SQL
  • 6. 1.- IntroducciónEs una potente herramienta que permite controlar la persistencia de nuestras aplicaciones contra cualquier base de datos, encapsulando la persistencia de objetos Java a bases de datos relacionales.Existen otras soluciones alternativas a Hibernate pero esta es una de las mas completas y con una amplia difusión en el desarrollo Java.Hibernate realiza automáticamente la inserción y recuperación en base de datos de cualquier objeto Java, haciendo transparente todo el proceso de conexión y las consultas SQL necesarias para insertar, actulizar, eliminar o recuperar la información.También permite manejar colecciones de objetos Java como ArrayList, Vector, Hashtable, Collection, Set y Map.¿Qué es?
  • 7. 1.- IntroducciónHibernate es un motor de persistencia de código abierto que nos facilitará tareas como recuperar, guardar, modificar o eliminar objetos en una base de datos relacional.session.get(string tipo,id);|session.load(string tipo,id);session.save(miObjeto);session.saveOrUpdate(miObjeto);session.delete(miObjeto);Se configura mediante un archivo de configuración hibernate.properties ó hibernate.cfg.xml donde se definen los objetos con sus equivalencias en base de datos.En el archivo de configuración se asocia una Clase a una Tabla y cada Propiedad de la clase a una Columna de dicha tabla.¿Qué es?
  • 8. 1.- IntroducciónResumen de característicasReduce el código a escribirFácil modelo de programación (POJO)Tiene estrategias avanzadas de cache (L1 y L2)Optimiza las SQL (nunca actualiza datos vacios)Tiene estrategias de carga perezosasDa independencia y abstracción sobre los proveedores de base de datosMapea relaciones de tipos de objetos (one-to-one, one-to-many, many-to-many)Provee objetos desconectadosTiene soporte completo para JTATiene excelente integración con Spring
  • 9. 2.- Elementos principalesModeloClases a persistirHan de seguir las especificaciones JavaBeansArchivo de mapeoRelaciona el objeto a persistir co nuna entidad de la base de datosArchivo de configuraciónSe configura por ficheros de configuración en los cuales se indicaOrigen de datosTransaccionesetcDAOClase que aglomera todo el tratamiento de la persistencia
  • 10. 3.- Libreríasswarmcache-1.0rc2.jar (1.0rc2)runtime, optionaljboss-cache.jar (1.2.2 alpha)TreeCache clustered cache- runtime, optionaljgroups-2.2.8.jar (2.2.8)JGroups multicast libraryruntime, optional (required by replicated caches)jta.jar Standard JTA APIruntime, required for standalone operation (outside application server)xml-apis.jar Standard JAXP APIruntime, some SAX parser is requiredcommons-logging-1.0.4.jar (1.0.4)Commons Loggingruntime, requiredc3p0-0.9.1.jar (0.9.1)C3P0 JDBC connection pool runtime, optional (needed if using c3p0 as the connection pooling library)jboss-system.jar runtime, optional (required by TreeCache)
  • 11. 3.- Libreriasasm-attrs.jar (unknown)ASM bytecode libraryruntime, required if using 'cglib' bytecode providerjacc-1_0-fr.jar (1.0-fr)JACC Libraryruntime, optionalcheckstyle-all.jar CheckstyleBuildtimelog4j-1.2.11.jar (1.2.11)Log4j Libraryruntime, optionaljunit-3.8.1.jar (3.8.1)JUnit test frameworkbuildtimejavassist.jar (3.4)Javassist bytecode generatorruntime, required if using 'javassist' bytecode providerdom4j-1.6.1.jar (1.6.1)XML configuration & mapping parserruntime, requiredantlr-2.7.6.jar (2.7.6)ANother Tool for Language Recognitionruntime, requiredcglib-2.1.3.jar (2.1.3)CGLIB bytecode generatorruntime, required if using 'cglib' bytecode providerjboss-common.jar runtime, optional (required by TreeCache)
  • 12. 3.- Libreriasoscache-2.1.jar (2.1)OpenSymphony OSCacheruntime, optionalasm.jar ASM bytecode libraryruntime, required if using 'cglib' bytecode providerant-launcher-1.6.5.jar (1.6.5)Ant launcherbuildtimejaas.jar Standard JAAS APIruntime, optional (required by JCA)ant-antlr-1.6.5.jar (1.6.5)Ant antlr supportbuildtimejboss-jmx.jarruntime, optional (required by TreeCache)cleanimports.jarCleanimportsbuildtimexerces-2.6.2.jar (2.6.2)SAX parserruntime, required for JDK < 1.4jaxen-1.1-beta-7.jar (1.1-beta-7)Jaxen - universal java xpath engineruntime, required if you want to deserialize a Configuration to improve startup performanceant-junit-1.6.5.jar (1.6.5)Ant junit supportbuildtime
  • 13. 3.- Libreriasant-swing-1.6.5.jar (1.6.5)Ant swing supportbuildtimecommons-collections-2.1.1.jar (2.1.1)Commons Collectionsruntime, requiredant-1.6.5.jar (1.6.5)Ant core- buildtimeproxool-0.8.3.jar (0.8.3)Proxool JDBC connection pool- runtime, optional (needed if using proxool as the connection pooling library)concurrent-1.3.2.jar (1.3.2)runtime, optional (required by TreeCache)syndiag2.jar (2.0)antlr to bnf image generatorbuildtime
  • 14. 4.- CompatibilidadOracleDB2SysbaseMS SQL ServerMySQLInterbaseInformixFirebirdOtras…Soporta algunas bases de datos como
  • 15. 5.- diagrama de ArquitecturaArquitectura multicapasHibernate usa los ficheros de configuración para proporcionar servicios de persistencia a las aplicaciones
  • 16. 5.- diagrama de ArquitecturaVista detallada de la arquitectura de Hibernate
  • 17. 5.- diagrama de ArquitecturaVista detallada de la arquitectura de Hibernateorg.hibernate.SessionFactoryCache inmutable de los mapeos compilados para una base de datos.Es una factoria de Session y un cliente de ConnectionProvider.Puede almacenar un segundo nivel de cache de datos rehusables, entre transacciones, procesos o a nivel de cluster.SessionFactory
  • 18. 5.- diagrama de ArquitecturaVista detallada de la arquitectura de Hibernateorg.hibernate.SessionEnvuelve una conexión JDBC.Factoria de transaccionseAlmacena el primer nivel de cache para los objetos persistentes cuando son buscados por identificador o mediante queries.Tiene un corto periodo de vida mientras la aplicación y la DB intercambian información.Session
  • 19. 5.- diagrama de ArquitecturaVista detallada de la arquitectura de HibernateLos objetos persistentes y las colecciones.Llamados también POJOS o JavaBeansContienen el estado los datos persistentesSe asocian únicamente a una Session.Tan pronto como la Session se cierra, estos son desligados y liberados para ser utilizados en cualquier capa de la aplicación (DTO)Objetos persistentes
  • 20. 5.- diagrama de ArquitecturaVista detallada de la arquitectura de HibernateTodos los objetos que involucra hibernate (clases-tablas) pueden tener tres estados:TransientLa instancia no esta asociada con ningún contexto de persistencia. No tiene identificador de persistencia (PK).PersistentInstancia asociada a un contexto persistente, su PK tiene valor y puede corresponder con una fila de base de datos.DetachedLa instancia estuvo asociada a un contexto pero este fue cerrado o fue serializada a otro procesoEstados de las instancias de los objetos persistentes
  • 21. 5.- diagrama de ArquitecturaVista detallada de la arquitectura de HibernateObjetos transitorios y coleccionesSon instancias de las clases persistentes que no estan asociadas a una Session.Pueden ser instanciadas por la aplicación y no ser persistidas o pueden ser el resultado de un correcto cierre de la sesion (session.close())Objetos transitorios
  • 22. 5.- diagrama de ArquitecturaVista detallada de la arquitectura de Hibernateorg.hibernate.Transaction(Opcional) Usado por las aplicaciones para indicar unidades de trabajo atómicas.Abstrae a la aplicación de las transacciones subjacentes de JDBC, JTA o CORBA.Una session puede crear múltiples transacciones en algunos casos.Toda transaccion se ha confirmar o rechazar.Transaction
  • 23. 5.- diagrama de ArquitecturaVista detallada de la arquitectura de Hibernateorg.hibernate.connection.ConnectionProvider(Opcional) Factoria de conexiones JDBCAbstrae a la aplicación del uso de DataSource o DriverManager.No esta expuesta para la aplicación, per o los desarrolladores lo pueden extender o implementar.ConnectionProvider
  • 24. 5.- diagrama de ArquitecturaVista detallada de la arquitectura de Hibernateorg.hibernate.TransactionFactory(Opcional) Factoria de instancias de transacciones.No esta expuesta para la aplicación, pero los desarrolladores pueden implementarla o extenderla.TransactionFactory
  • 25. 5.- diagrama de ArquitecturaAPI de Hibernate
  • 26. Hibernate.cfg.xmlArchivo XML principal de configuración de Hiberntate.Su estructura viene marcada por un fichero descriptivo llamado hibernate-configuration-3.0.dtdContiene los datos de conexión con la base de datos.Contiene los mapeos a los ficheros descriptivos de las clases persistentes del dominio.
  • 27. Hibernate.cfg.xmlSessionFactoryPropertyMapping resourceSi la SessionFactory no tiene un nombre se utiliza por defecto a nivel global de la aplicación, si se dispone de varias bases de datos hay que tener un SessionFactory por cada una, en diferentes ficheros de configuración.En las propiedades (Property) se definen los elementos necesarios para establecer las conexiones.Mediante la etiqueta Mapping se señala donde esta el fichero xml con el mapeo entre las clases Java y la tabla de la base de datos enlazada.Principales etiquetas
  • 28. Hibernate.cfg.xmlPrincipales etiquetasLas propiedades (property)hibernate.connection.driver_class : oracle.jdbc.driver.OracleDriverhibernate.connection.username : testhibernate.connection.password : testhibernate.connection.url : jdbc:oracle:thin:@localhost:1521:xehibernate.dialect : org.hibernate.dialect.Oracle10gDialecthibernate.connection.autocommit : trueHibernate.showsql : truehibernate.default_schema : testcache.provider_class : org.hibernate.cache.NoCacheProviderhbm2ddl.auto : createhibernate.use_sql_comments : trueImplemetación particular de SQL que Hibernate generaMuestra las sentencias SQL que Hibernate ejecutaCrea automáticamente el esquema de base de datosDesactiva la cache de segundo nivelGenera comentadios dentro de las sentencias SQL para facilitar la depuración
  • 30. Hibernate.cfg.xmlEn el apartado 7 se cubre la forma como se carga la configuración de hibernte con una clase utilitaria llamada HibernateUtil.Todos los nombres de las propiedades que soporta Hibernate estan definidos en org.hibernate.cfg.EnvironmentUtilización y carga
  • 31. 6.- Las clases persistentesSon las clases del modelo que se guardan en la base de datos y se pueden recuperar. Usualmente denominadas POJO(Plain Old Java Object)Toda clase persistente tiene un fichero descriptivo .hbm, el cual describe el mapeo entre la clase y la tabla de la base de datos asociada., Asi como parametros de actualización en cascada, composición del método ToString, y otros.
  • 32. 6.- Las clases persistentesHan de cumplir una serie de requisitos:Métodos get y set para cada atributo de la clase.Constructor por defecto sin argumentos para que hibernate pueda instanciarla.Atributo identificador, en la clase persona el atributo id es el identificador de la clase y la PK de la tabla correspondiente.Es recomendable implementar los métodos equals() y hashcode().Interfaz Lifecycle.- de forma opcional una clase persistente puede implementar esta interfaz, la cual permite ejecutar acciones después de alguna operación
  • 33. 6.- Las clases persistentesLas clases persistentes pueden implementar esta interfaz de manera opcional.Proporciona callbacks desde la session hacia el objeto persistente.onSave .- invocado antes que el objeto sea almacenado. onUpdate .- Invocado antes que el objeto sea actualizado.onDelete .- Invocado antes que el objeto sea eliminado.onLoad .- invocado después que el objeto sea cargado de la base de datos.Interfaz Lifecycle
  • 34. 6.- Las clases persistentesEn aplicaciones reales se dan estructuras complicadas de base de datos, existiendo a veces múltiple dependencias entre objetos y diversas restricciones de integridad.Los ficheros de mapeo dan cobertura a los requisitos mencionados anteriormente mediante etiquetas que definen diversos tipos de clases como colecciones de objetos, herencias o clases persistentes cuyos atributos son otras clases persistentes.Mapeo de las clases
  • 35. 6.- Las clases persistentesMapeo de tipos de datosMapeo de las clases
  • 36. 6.- Las clases persistentesEjemplo de clase mapeada - Categoria.hbm.xml<hibernate-mapping> <class name="edu.training.hibernate.Categoria" table="CATEGORIA"> <id name="idCategoria" type="big_decimal"> <column name="ID_CATEGORIA" precision="22" scale="0" /> <generator class="assigned" /> </id> <property name="nombre" type="string"> <column name="NOMBRE" length="100" /> </property> <set name="productos" inverse="true"> <key> <column name="ID_CATEGORIA" precision="22" scale="0" /> </key> <one-to-many class="edu.training.hibernate.Producto" /> </set> </class></hibernate-mapping>El generador de claves primarias además de ser asignado manualmenete, tambien se puede establecer mediante una secuence:<generatorclass="sequence"> <param name="sequence">SEQ_de_oracle</param></generator>Aunque tambien una clase personalizada que implemente de org.hibernate.id.IdentifierGenerator<generatorclass="edu.training.hibernate.generator.CustomGenerator">
  • 37. 6.- Las clases persistentesEjemplo de clase mapeada - Categoria.javapublic class Categoria implements java.io.Serializable { private BigDecimal idCategoria; private String nombre; private Set<Producto> productos = new HashSet<Producto>(0); public Categoria() { } public Categoria(BigDecimal idCategoria) { this.idCategoria = idCategoria; } public Categoria(BigDecimal idCategoria, String nombre, Set<Producto> productos) { this.idCategoria = idCategoria; this.nombre = nombre; this.productos = productos; }
  • 38. 6.- Las clases persistentesEjemplo de clase mapeada - Categoria.java public BigDecimal getIdCategoria() { return this.idCategoria; } public void setIdCategoria(BigDecimal idCategoria) { this.idCategoria = idCategoria; } public String getNombre() { return this.nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public Set<Producto> getProductos() { return this.productos; } public void setProductos(Set<Producto> productos) { this.productos = productos; }}
  • 39. 6.- Las clases persistentesRestricciones de seguridad<Many-to-one>: Utilizada para definir relaciones de muchos a uno, como por ejemplo varios productos que pertenecen a un único pedido.<One-to-Many>: Es el caso contrario al anterior, en el fichero de mapeo de la clase pedido se podrá indicar que este puede contener varios productos.<One-to-one>: Para definir relaciones uno a uno y se utiliza para tablas que compartan la clave primaria o para referencias a una clave foránea.Mapeo de las clases
  • 40. 6.- Las clases persistentesColecciones de objetosHibernate puede tratar instancias de:Map, Set, SortedMap, SortedSet, List, Cualquier array de objetos persistentes.Las etiquetas que pueden mapear esto son: <map>, <set>, <list>, <bag>, <array> y <primitive-array>Mapeo de las clases
  • 41. 6.- Las clases persistentesLa Herencia, en Hibernate es abordada de tres formas distintas.La más elegante es usar la misma tabla para almacenar los datos de las distintas clases de la misma familiaSe puede observar que de la clase Perro heredan dos clases hijas que serian Mastin y Bulldog, esto se hace con la etiqueta <subclass>.Mapeo de las clases
  • 42. 6.- Las clases persistentesLa Herencia, en Hibernate es abordada de tres formas distintas.La segunda forma de herencia es guardar los datos de una subclase en otra tabla distinta sustituyendo la etiqueta <subclass>.La tercera forma es definir la herencia con una etiqueta class para cada clase de la familia, con lo que se guardarían en tablas independientes, sin ninguna relación entre ellas.Mapeo de las clases
  • 43. 7.- utilizaciónLo primero que se deberíamos hacer para utilizar Hibernate es crear un objeto Configuration para indicarle donde esta el archivo de configuración.Configuration cfg = new Configuration();cfg.configure(“…\hibernate.cfg.xml”);Ahora deberiamos abrir una sesión en Hibernate con el SessionFactory.SessionFactory sessionFactory = cfg.buildSessionFactory();Session session = sessionFactory.openSession();Una session representa una conexión con la base de datos, es recomendable tener una clase que se especialice en darnos acceso de forma conveniente al SessionFactoryCarga de configuración y el SessionFactory
  • 44. 7.- utilizaciónHibernateUtilpublicclassHibernateUtil {privatestatic final SessionFactorysessionFactory;static { try {sessionFactory = new Configuration().configure().buildSessionFactory(); } catch (Throwable ex) { // Makesureyou log theexception, as itmight be swallowedSystem.err.println("InitialSessionFactorycreationfailed." + ex);throw new ExceptionInInitializerError(ex); } }publicstaticSessionFactorygetSessionFactory() {returnsessionFactory; }}
  • 45. 7.- utilizaciónCarga de un SessionFactory desde JNDIprivate final SessionFactorysessionFactory = getSessionFactory();protectedSessionFactorygetSessionFactory() { try {return (SessionFactory) new InitialContext().lookup("SessionFactory"); } catch (Exception e) {log.error("CouldnotlocateSessionFactory in JNDI", e);throw new IllegalStateException( "CouldnotlocateSessionFactory in JNDI"); }}
  • 46. 8.- carga de objetos por su idCRUD Para recuperar un objeto de la base de datos el objeto session dispone de los métodos load y get.Solo se debe utilizar load si se esta seguro que el objeto existe.El método get devuelve la instancia de un objeto o null si esta no existe.public Usuario findById(java.math.BigDecimalid) {log.debug("getting Usuario instancewith id: " + id); try { Usuario instance = (Usuario) sessionFactory.getCurrentSession().get("edu.training.hibernate.Usuario", id);if (instance == null) {log.debug("getsuccessful, no instancefound"); } else {log.debug("getsuccessful, instancefound"); }returninstance;…………..
  • 47. 8.- nuevos objetos persistentesCRUD Para almacenar todos los objetos de nueva creación en la base de datos es necesario invocar el método save del objeto session.Usuario usr = new Usuario();usr.setApellidos("apellidos hibernate");usr.setNombre("nombre hibernate");usr.setPassword("password");usr.setTipo("admin2");usr.setUsuario("hib@hib.org2");ses.save(usr);
  • 48. 8.- búsqueda de objetosUso de criterios de búsqueda La clase org.hibernate.Criteria, esta es un API para recuperar entidades mediante la composición de criterios y que es capaz de devolver múltiples resultados.publicList<Usuario> findByExample(Usuario instance) {log.debug("finding Usuario instancebyexample"); try {Criteriacriterio = sessionFactory .getCurrentSession().createCriteria("edu.training.hibernate.Usuario");criterio.add(create(instance));List<Usuario> results = (List<Usuario>) criterio.list();log.debug("findbyexamplesuccessful, resultsize: "+ results.size());returnresults; } catch (RuntimeException re) {} …………..
  • 49. 8.- búsqueda de objetosUso de criterios de búsqueda Listcats = session.createCriteria(Cat.class) .add( Restrictions.like("name", "Iz%") ) .add( Restrictions.gt( "weight", new Float(minWeight) ) ) .addOrder( Order.asc("age") ) .list();
  • 50. 8.- Actualización de objetosLa actualización de la base de datos se puede hacer de dos formas distintasLa primera mediante el método flush del objeto session. Este método hace que se actualice en la base de datos que estén en memoria en el estado actual. Se recomienda su uso antes de :Hacer un commitCerrar una sessionDependiendo del parametro flush-mode, Transaction.commit() llama al método flush.La otra forma es utilizando el método saveOrUpdate, el cual graba un objeto nuevo o lo actualiza, dependiendo del valor almacenado en unsaved-value.Esta operación se lanza en cascada en sus instancias asociadas si en el fichero de mapeo se encuentra cascade="save-update".CRUD
  • 51. 8.- Actualización de objetosCRUD publicvoidattachDirty(Usuario instance) {log.debug("attachingdirty Usuario instance"); try {sessionFactory.getCurrentSession().saveOrUpdate(instance);log.debug("attachsuccessful"); } catch (RuntimeException re) {log.error("attachfailed", re);throw re; }}
  • 52. 8.- Borrado de objetosCRUD Para eliminar un objeto existe el método delete del objeto session.También es posible eliminar varios objetos con una sola llamada al método delete pasándole una query.publicvoiddelete(Usuario persistentInstance) {log.debug("deleting Usuario instance"); try {sessionFactory.getCurrentSession().delete(persistentInstance);log.debug("deletesuccessful"); } catch (RuntimeException re) {log.error("deletefailed", re);throw re; }}
  • 53. 8.- Sincronización de datosCRUD - session.flush() Llegado el momento en que la session ha ejecutar las sentencias SQL y volcar el estado de los objetos en la base de datos, la session dispone de un método llamado flush, el cual se encarga de hacer esto.El proceso de flush ocurre por defecto en los siguientes puntos:Antes de la ejecución de las queriesDesde el commit de una transaccionDesde session.flush()Las sentencias SQL son ejecutadas en el siguiente orden:Todos los inserts en el orden en el que hayan sido guardados (session.save())Todas las actualizacionesTodas las sentencias de borrado
  • 54. 9.- TransaccionesHibernate utiliza directamente conexiones JDBC y recursos JTA sin añadir comportamientos adicionales de bloqueo.Hibernate no bloquea los objetos en memoria.Mediante el objeto Session, Hibernate proporciona multiples lecturas de objetos por su identificador y las queries de entidades.El objeto SessionFactory es costoso de crear, pero puede ser compartido por todos los threads de la aplicación, este suele ser creado una vez cuando la aplicación se inicia desde una instancia del objeto Configuration.Transacciones y concurrencia
  • 55. 9.- TransaccionesUna Session no es cara de crear (no es threadsafe), se suele utilizar en una petición o unidad de trabajo y posteriormente es descatado y sobre todo no obtiene una conexión JDBC hasta que no es realmente necesario.Una transaccion ha de durar lo menos posible para reducir la contención de bloqueo en la base de datos.Las transacciones de periodos muy largos pueden impedir que la aplicación escale durante una fuerte carga de concurrencia.Transacciones y concurrencia
  • 56. 9.- TransaccionesTransaction tx = session.beginTransaction(); tx.commit(); tx.rollback(); Transaction
  • 57. 9.- TransaccionesEjemplo simple de Transactionpublicstaticvoidmain(String[] args) {Configurationcfg = new Configuration();SessionFactoryfactory = cfg.configure().buildSessionFactory();Sessionsession = factory.openSession();Transactiontx = session.beginTransaction();Messagesmessage = new Messages();message.setMessageText(“HelloWorld);session.save(message);tx.commit();}
  • 58. 10.- hibernatequerylanguageSQL orientado a objetosClases y atributos vs. Tablas y columnasAsociaciones, polimorfismoSoporta operaciones relacionalesProyección, agregación, gruposSubconsultasFunciones SQLHQL
  • 59. 10.- hibernatequerylanguageLenguaje de consultas de Hibernate similar al SQL, pero orientado a objetos. Ej.:from paquete.PersonaLa cláusula select es opcional, es necesario indicar el paquete al que pertenece la clase, por que en las consultas es el nombre de las clases el que se utiliza y NO el de la tabla de base de datos.En la cláusula select hay que hacer referencia a los atributos de la clase, ya que es la propia clase la que es referenciada en la consulta y NO la tabla en la que se almacena.Select per.nombre from paquete.Persona perComo en SQL se pueden usar alias en los nombres de las tablas.HQL
  • 60. 10.- hibernatequerylanguageCuenta con las típicas funciones matemáticas que se pueden utilizar.El polimorfismo en las consultas se trata de una manera muy sencilla, si se hace una consulta sobre una clase, también se devolverán sus subclasesfrom java.lang.Object oEsta consulta devolverá todos los objetos persistentes.HQL
  • 61. 10.- hibernatequerylanguageLa cláusula where, es muy similar a la de SQL. La ventaja es que se pueden referenciar los atributos de la clase que se consulte, incluso si es un array.Los operadores habituales disponibles son : =, >=, <=, <>, ¡=, like.HQL
  • 62. 10.- hibernatequerylanguageEl resto de cláusulas típicas de SQL tambien se pueden utilizar en HQL como:group byhavingorder byEtc...HQL
  • 63. 10.- Consultas hqlMétodosCuando no se conoce el identificador de los objetos a cargar, Hibernate nos proporciona un mecanismo de consultas para ubicarlos y cargarlos desde la base de datos.Este mecanismo se conoce como HQL, el cual permite hacer consultas directamente sobre las clases java.El método createQuery (String consulta) del objeto session permite crear consultas HQL, para luego invocar al método list().Las consultas tambien se pueden expresar en SQL nativo con el soporte de Hiberntate para convertir el conjunto de resultados en objetos Java.Las consultas HQL y el SQL nativo se representa con una instancia de org.hibernate.Query, este ofrece métodos para enlazar parametros, manejo de resultados y ejecución de la query asociada.
  • 64. 10.- Consultas hqlMétodosPara poder controlar los resultados que devuelve una consulta, como puede ser el número máximo de filas o la primera fila que se debe devolver, se puede crear una instancia de la clase Query.Como se aprecia hay diferentes maneras de recuperar los datos de las tablas con Hibernate, sin utilizar SQL, de todas maneras es posible realizar consultas en SQL nativo, si así se desea.
  • 65. 10.- Consultas hqlConsultas con parámetros Query q = session.createQuery("from Categoria where nombre like :pnombre order by nombre desc");q.setString("pnombre", "%ad%");List<Categoria> results = (List<Categoria>) q.list();System.out.println("resultados devueltos : " + results.size());if(results.size() > 0 ){ for(Categoria c : results){ System.out.println("Id : " + c.getIdCategoria()); System.out.println("Nombre : " + c.getNombre()); }}
  • 66. 10.- Consultas hqlResultados escalaresIterator results = sess.createQuery("select cat.color, min(cat.birthdate), count(cat) from Cat cat " + "group by cat.color") .list() .iterator();while ( results.hasNext() ) { Object[] row = (Object[]) results.next();Color type = (Color) row[0];Date oldest = (Date) row[1];Integer count = (Integer) row[2]; .....}
  • 67. 10.- Consultas hqlFiltrado por conjunto de valores//named parameter listList names = new ArrayList();names.add("Izi");names.add("Fritz");Query q = sess.createQuery("from DomesticCat cat where cat.name in (:namesList)");q.setParameterList("namesList", names);List cats = q.list();
  • 68. 10.- Consultas sql NativasExternalización de consultas en ficherosSe pueden definir consultas HQL y almacenarlas en un fichero asignandoles un nombre a cada una de ellas y estableciendo el mapping dentro del Hibernte.cfg.xml como si fuera el mapeo de una clase.<hibernate-mapping><query name="CategoriasPorNombre"><![CDATA[from Categoria where nombre like :pnombre order by nombredesc]]></query></hibernate-mapping>Query q = session.getNamedQuery("CategoriasPorNombre");q.setString("pnombre", "%ad%");List<Categoria> results = (List<Categoria>) q.list();
  • 69. 10.- Consultas nativas sqlcreateSQLQuerySe pueden definir consultas HQL y almacenarlas en un fichero asignandoles un nombre a cada una de ellas y estableciendo el mapping dentro del Hibernte.cfg.xml como si fuera el mapeo de una clase.Las consultas sql tambien pueden ser externalizadas y tener parametros.Listcats = session.createSQLQuery( "SELECT {cat}.ID AS {cat.id}, {cat}.SEX AS {cat.sex}, " + "{cat}.MATE AS {cat.mate}, {cat}.SUBCLASS AS {cat.class}, ... " + "FROM CAT {cat} WHERE ROWNUM<10", "cat",Cat.class).list()
  • 70. 11.- cachéLa caché es un mecanismo que nos permite almacenar nuestras estructuras de datos en memoria, evitándonos volver a buscar nuevamente los datos en la BBDD que además se puede compartir con otros sistemas.El usuario consultaSi la aplicación la tiene en caché se devuelven los datos directamente.Si la aplicación NO la tiene la recupera de la fuente de datos asociada, la almacena en caché y devuelve los datos.Presenta problemas de inconsistencia de datos cuando hay mas de una caché con los mismos datos cargados ya que podrían cambiar sin que una de las caches se entere.
  • 71. 11.- cachéOfrece una caché de dos niveles (L1 y L2), donde solo el primero es obligatorio.También incluye una caché de consultas, pudiendo obtener rápidamente resultados que hayan sido consultados previamente.
  • 72. PresentaciónInterpretaciónServiciosSpring FrameworkIoC, AOPIntegración12.- hibernate y springArquitectura de aplicaciones Spring con HibernateJSP/ JSF / Struts / Spring MVCManagers – Classes JavaOrientación a AspectosServices – Classes JavaHibernateWrappersJAASPL/SQLLDAPRelationalDDBB
  • 73. 12.- hibernate y springDiseño Spring con HibernateManager / Delegate<<interfaz>>ServiceService ImplSpring<<interfaz>>DAOHibernateDaoSupportDAO ImplModelo / POJOsFicheros de mappingHibernate
  • 74. 12.- hibernate y springAdministra la SessionFactory y la Session.Administración declarativa de transacciones en contenedores ligeros.Fácil de testear (se puede añadir una SessionFactory vía ficheros XML)Pocas lineas de código (enfocado más en el negocio)Modulo Spring ORM : Soporte para Hibernate
  • 75. 12.- hibernate y springHibernateTemplateProporcionado por SpringHibernate AOPLos DAO necesitan extender de HibernateDAOSupportLos métodos de los DAO son limpiosTransactionTemplatePermite la ejecución de código transaccional sin necesidad de re-implementar los workflowsEjecuta rollbacks si los callbacks originan alguna excepciónTransactionInterceptorLos bussines objects no necesitan ser conscientes de las transacciones.Soporta excepciones checked y uncheckedModulo Spring ORM : Soporte para Hibernate
  • 76. 12.- hibernate y springSession session = HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();try{ session.saveOrUpdate(timesheet); session.getTransaction().commit();}catch (HibernateException e){ session.getTransaction().rollback(); throw e;}getHibernateTemplate().saveOrUpdate(timesheet);Modulo Spring ORM : Soporte para Hibernate
  • 78. Parte prácticahibernate 3.2
  • 79. InstalaciónTenemos que descargarlo de http://www.hibernate.org/Hay que colocar sus JARs dentro del directorio LIB de nuestra aplicación.Los ficheros de configuración de cada clase deben ir acompañando a sus fuentes (src\...\...)Debemos colocar el fichero de configuración de Hibernate hibernate.cfg.xml en la raíz del directorio src
  • 80. Utilización – Ejemplo simplePasosCrear una tabla en la base de datosClase equivalente en código javaCrear el fichero de mapeo, los cuales indican la correspondencia entre los atributos de la clase y los de la tabla de la base de datos.Código Java de utilización del API de Hibernate.
  • 81. Utilización – Ejemplo simpleCreación de la tabla en la base de datos.CREATE TABLE persona (id VARCHAR(32) NOT NULL PRIMARY KEY, edad INTEGER NOT NULL, nombre VARCHAR(255) NOT NULL);
  • 82. Utilización – Ejemplo simpleLa clase persistente
  • 83. Utilización – Ejemplo simpleFichero de mapeo Persona.hbm.xml, ubicado en el mismo directorio que la clase compilada.
  • 84. Utilización – Ejemplo simpleCódigo Java de utilización del API de HibernateInsertando en la base de datos Recuperando un objeto por su identificador
  • 85. Jboss ide - hibernate toolsUna herramienta útil para hacer proyectos Hibernate es Hibernate-Tools, que viene incorporada dentro de JBossIDEEl update-site de eclipse es:http://download.jboss.org/jbosstools/updates/stable/Diapositivas con un el desarrollo de un proyecto de persistencia.
  • 86. - FIN -Licensed under Creative Commons Attribution 3