Tutorial de Hibernate
|
|
|
- Soledad Paz Fernández
- hace 10 años
- Vistas:
Transcripción
1 Tutorial de Hibernate
2 Índice de contenido Introducción... 4 Herramientas necesarias...6 Hibernate... 6 HSQL...6 Eclipse... 6 Derby...6 Aplicación sencilla usando Hibernate...7 Crear el proyecto Java con Eclipse...7 Configuración del Build Path...9 Creación de las clases Java...12 Clase del objeto de dominio Clase de Manejo del objeto de dominio Configuración de Hibernate El archivo hibernate.cfg.xml...18 El archivo Libro.hbm.xml...19 Creación del archivo log2j.properties...20 Automatización del proceso de construcción con ANT...20 Correr la aplicación Aplicación sencilla utilizando Hibernate y Derby Configuración de el archivo hibernate.cfg.xml...27 Corriendo la aplicación Creando aplicaciones con Hibernate...32 Anatomía de los archivo de mapeo Tipos de datos soportados por Hibernate...33 Atributos del elemento <hibernate-mapping>...33 Atributos del elemento <class> Atributos del elemento <id>...36 Atributos del elemento <generator> Atributos del elemento <property>...37 Relaciones entre tablas Atributos del elemento <one-to-one>...39 Atributos del elemento <one-to-many>...40 Atributos del elemento <many-to-many>...42 Atributos comunes de los elementos de colección Atributos del elemento <set>...43 Atributos del elemento <list>...45 Atributos del elemento <idbag>...45 Atributos del elemento <map>...45 Atributos del elemento <bag>...46 Relaciones bidireccionales Relaciones del tipo <one-to-many>...46 Relaciones del tipo <many-to-many>...47 Mapeo de clases y sus relaciones... 49
3 Mapeo de la relación de composición Mapeo de la relación de herencia Referencias...55 En ingles...55 En español... 55
4 Introducción Al trabajar con programación orientada a objetos en muchas ocasiones nos encontramos con el problema de hacer persistir los objetos en una base de datos relacional, esto nos involucra en el problema de que el mundo relacional y el orientado a objetos no son del todo compatibles. Para evidenciar este problema imaginemos que tenemos que hacer persistir un solo objeto en una tabla relacional, esto evidentemente involucra la creación de un DAO (Data Access Object) que nos permita hacer persistir a este objeto. Este DAO debe tener la implementación de código SQL para tener acceso a la base de datos en la queremos realizar la persistencia y este código debe permitir almacenar en los campos de la tabla todo el estado del objeto Ejemplo: Libro -id: Integer -titulo: String -autor: String +getid(): Integer +setid(integer) +gettitulo(): String +settitulo(string) +getautor(): String +setautor(string) Ilustración 1: Clase Libro La Ilustración 1 muestra el objeto de dominio Libro que deseamos hacer persistir. Para esto en el objeto DAO deberíamos tener implementado el método create que deberia ser similar al siguiente código: public boolean create(libro libro){ try { // Prepara el statement PreparedStatement statement = DatabaseManager.getConnection().prepareStatement( "INSERT INTO Libro VALUES (?,?,? )"); statement.setinteger(1,libro.getid()); statement.setstring(2,libro.gettitulo()); statement.setstring(3,libro.getautor()); statement.executeupdate();
5 } return true; } catch (SQLException e) { } // Cacha excepcion e.printstacktrace(); return false; En realidad hacer persistir un solo objeto en una tabla relacional es bastante sencillo, el problema es que en la vida real no solo se realiza persistencia de un solo objeto y mucho menos de varios objetos sin relación entre ellos, como se puede notar el realizar persistencia en bases de datos relacionales es bastante complejo. Para solventar estos problemas existen frameworks que se encargan de realizar este mapeo de Objeto a Relacional, a estos frameworks se les denomina ORM (Object-Relational Mapping). En esta tutorial vamos a trabajar con Hibernate, un ORM open source bastante maduro. Antes de entrar en el detalle de Hibernate vamos a mostrar como un ORM realiza el mapeo de Orientado a Relacional para que se observen las ventajas de utilizar estos frameworks. Un buen ORM permite tomar un objeto Java y hacerlo persistir de una forma similar a la siguiente: orm.save(object); la instrucción anterior debe generar todo el código SQL para realizar la persistencia del objeto El ORM debe permitir cargar un objeto Java complejo (con relaciones hacia otros objetos) de la base de datos a memoria: myobject = orm.load(myobject.class,objectid); EL ORM debe permitir hacer consultas a las tablas de la base de datos: List myobjects = orm.find("from MyObject object WHERE object.property = 5"); Como se puede observar en estos ejemplos los métodos save, load y find tienen una correspondencia con los métodos create y retrieve que se implementan usualmente en un DAO, pero con la ventaja de que son mas sencillos e intuitivos de emplear y reducen fallas al crear todo el código SQL.
6 Herramientas necesarias Hibernate Se puede obtener Hibernate directamente de su pagina en Internet de aquí se puede obtener el zip de Hibernate que es la versión que vamos a utilizar. Después de obtener el zip lo vamos a crear una carpeta llamada home en la unidad C:, y en esta vamos a descomprimir el zip de Hibernate. Nota: El nombre y la localización de la carpeta es una sugerencia propuesta en este tutorial, si se cambia el nombre y la localización se deben ajustar las direcciones en los sitios en donde se solicite HSQL HSQL se puede obtener de la pagina de esta vamos a descargar la versión que viene en zip. Suponiendo que ya tenemos Hibernate vamos a descomprimir el zip de HSQL en la carpeta home (o en la misa en donde se descomprimió Hibernate). Eclipse Eclipse es la herramienta que vamos a emplear para realizar el desarrollo de nuestras aplicaciones, este se puede obtener de la pagina La versión que vamos a utilizar sera la 3.2 que también viene en un zip que vamos a descomprimir en C:. Derby Derby es una base de datos embebida, open source que utilizaremos en lugar de HSQL en algunos de los ejemplos de este tutorial. Se puede obtener de la pagina cgi. Para este tutorial utilizaremos la versión que se obtiene en un zip de la pagina antes mencionada.
7 Aplicación sencilla usando Hibernate Objetivo de la aplicación: En esta aplicación vamos a crear una clase Libro que sera nuestro objeto de dominio y crearemos una tabla LIBRO usando Hibernate para realizar 2 operaciones sencillas: insertar un libro y ver la lista de libros en la base de datos. Crear el proyecto Java con Eclipse Vamos a crear la carpeta Hibernate en la carpeta hsqldb (que se crea al descomprimir HSQL) y vamos a abrir Eclipse y darle como dirección de workspace la dirección de la carpeta que creamos Ilustración 2: Selección de workspace Una vez en Eclipse vamos a crear un nuevo proyecto al que llamaremos PruebaHibernate. Al crearla le agregamos la carpeta de fuentes src y el package mx.uam.hibernate. Ilustración 3: árbol del proyecto
8 Ahora vamos a crear los directorios lib en donde vamos a agregar las librerías que vamos a ocupar y data en donde HSQL genera una bitácora de las operaciones hechas en la base de datos, estos directorios se crean en la raíz del proyecto. En el directorio de lib vamos a copiar del directorio lib de Hibernate los siguientes jars: cglib-2.1 commons-logging hibernate3 jta commons-collections dom4j-1.6 jdbc2_0-stdext log4j asm antlr-2.7.5h3 y del directorio lib de hsql el jar hsql.jar Ilustración 4: El directorio lib con los jars necesarios
9 Configuración del Build Path Hasta este momento ya tenemos los jars necesarios para trabajar, ahora hay que decirle a Eclipse que los agregue a su build path para que puede trabajar con ellos. Para hacer esto seleccionamos el proyecto y sobre el damos click con el botón derecho y seleccionamos la opción Build Path->Configure Build Path, esto provoca que emerja el dialogo Properties for PruebaHibernateen la sección de Java Build Path, en esta sección seleccionamos la opción de add JARs, y en el dialogo que emerge seleccionamos del directorio lib de PruebaHibernate uno de los jars que ahí aparecen y presionamos OK, esto agrega el jar al build path. Ilustración 5: Selección de los JARS
10 Ilustración 6: JAR agrega al Build Path Realizamos la misma operación para todos los jar que se encuentren en el directorio lib y una vez agregados presionamos OK.
11 Ilustración 7: JARs agregados al Build Path Al terminar tendremos una lista de jars debajo del JRE.
12 Ilustración 8: JARs agregados al Build Path Creación de las clases Java Para probar el funcionamiento de Hibernate vamos a crear 2 clases, 1 sera el objeto de dominio y la otra el objeto encargado de la persistencia usando Hibernate Clase del objeto de dominio Esta clase es una clase que modela la clase mostrada en la Ilustración 1, lo primero que hacemos es crear la clase con el wizard de eclipse.
13 Ilustración 9: Wizard para crear la clase Libro En esta clase agregamos el siguiente código: package mx.uam.hibernate; public class Libro { private Long id; private String titulo;
14 private String autor; public String getautor() { return autor; } public void setautor(string autor) { this.autor = autor; } public Long getid() { return id; } private void setid(long id) { this.id = id; } public String gettitulo() { return titulo; } public void settitulo(string titulo) { this.titulo = titulo; } } Cabe hacer notar que el método setid es privado, esto es por que solo Hibernate debe encargarse de administrar los id's de los objetos Libro, también se debe notar que este método marcara un warning por que ningún otro método de la clase lo esta utilizando. Otra cosa que vale la pena mencionar es que no se debe declarar la variable id como un tipo de datos primitivo, esto por facilidad de manejo para Hibernate. Clase de Manejo del objeto de dominio Esta clase se encarga de administrar al objeto de dominio, primero con el wizard de eclipse creamos la clase ManejadorLibro
15 Ilustración 10: wizard para crear la clase ManejadorLibro En esta clase agregamos el siguiente código: package mx.uam.hibernate; import java.util.list; import org.hibernate.hibernateexception; import org.hibernate.sessionfactory; import org.hibernate.transaction;
16 import org.hibernate.cfg.configuration; import org.hibernate.classic.session; public class ManejadorLibro { private SessionFactory sessionfactory; public ManejadorLibro() { try { System.out.println("Inicalizando Hibernate"); sessionfactory = new Configuration().configure().buildSessionFactory(); System.out.println("terminado la inicializacion de Hibernate"); } catch (HibernateException e) { e.printstacktrace(); } } private void agregalibro(string titulo, String autor) { try { Session session = sessionfactory.opensession(); Transaction tx = session.begintransaction(); Libro libro = new Libro(); libro.settitulo(titulo); libro.setautor(autor); session.save(libro); } tx.commit(); session.close(); } catch (HibernateException e) { e.printstacktrace(); } private List listalibros() {
17 try { Session session = sessionfactory.opensession(); Transaction tx = session.begintransaction(); List result = session.find("from Libro"); tx.commit(); session.close(); } return result; } catch (HibernateException e) { throw new RuntimeException(e.getMessage()); } public static void main(string[] args) { ManejadorLibro manejadorlibro = new ManejadorLibro(); if (args[0].equals("agrega")) { if(args[1]!= null && args[2]!= null){ manejadorlibro.agregalibro(args[1],args[2]); }else{ System.out.println("Faltan parametros"); } } else if (args[0].equals("lista")) { List libros = manejadorlibro.listalibros(); for (int i = 0; i<libros.size(); i++) { Libro libro = (Libro) libros.get(i); System.out.println("Libro: "+libro.gettitulo()+", Autor: "+libro.getautor()); } } System.exit(0); } } Esta clase recibe de la linea de comandos 2 tipos de comandos:
18 agrega titulo autor lista cabe mencionar que no se han hecho todas las validaciones por la simplicidad de la aplicación, pero esto no evita que se puedan hacer. Configuración de Hibernate Hasta ahora solo hemos mencionado algunos aspectos de Hibernate pero no hemos hecho ninguna configuración del servicio, en este momento vamos a configurar a Hibernate para que conozca al objeto que debe hacer persistir y en donde lo hará persistir. El archivo hibernate.cfg.xml En directorio src creamos el archivo hibernate.cfg.xml y agregamos el siguiente codigo: <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" " <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">org.hsqldb.jdbcdriver</property> <property name="hibernate.connection.url">jdbc:hsqldb:data/test</property> <property name="hibernate.connection.username">sa</property> <property name="hibernate.connection.password"></property> <property name="dialect">org.hibernate.dialect.hsqldialect</property> <property name="show_sql">true</property> <property name="transaction.factory_class"> org.hibernate.transaction.jdbctransactionfactory </property> <property name="hibernate.cache.provider_class"> org.hibernate.cache.hashtablecacheprovider </property> <property name="hibernate.hbm2ddl.auto">update</property> <mapping resource="mx/uam/hibernate/data/libro.hbm.xml"/> </session-factory> </hibernate-configuration> Este archivo contiene varios tags, pero lo importante es lo que contiene el tag hibernate-configuration, en este tag aparece otro llamado session-factory que contiene, en orden de aparición: La clase del manejador de JDBC La URL del la conexión con JDBC
19 El nombre de usuario de la base da datos El password del usuario de la base de datos El dialecto que Hibernate usara para realizar la persistencia del objeto Bandera para poder observar el código SQL La clase que se empleara para el manejo de las transacciones La clase que provee la implementación de la interfaz de CacheProvider Automáticamente actualiza los esquemas de la base de datos cuando se inicia y se apaga. Puede tomar 3 valores: create, update y create-drop El mapa que describe al objeto y su localización El archivo Libro.hbm.xml Este archivo le dice a Hibernate como es el objeto que debe persistir. Este archivo se debe colocar en el directorio que se dijo en el archivo de configuración de Hibernate, para esto debemos crear un directorio en el package mx.uam.hibernate llamado data y crear un archivo llamado Libro.hbm.xml con la siguiente información: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//hibernate/hibernate Mapping DTD 2.0//EN" " <hibernate-mapping> <class name="mx.uam.hibernate.libro" table="libro"> <id name="id" column="uid" type="long"> <generator class="increment"/> </id> <property name="titulo" type="string"/> <property name="autor" type="string"/> </class> </hibernate-mapping> Este documento contiene el tag hibernate-mapping que contiene el tag class que es el que contiene la información de la estructura del objeto, esta información es: El nombre de la clase y la tabla en la que se hará la persistencia El tag id que dice a que columna se va a mapear, su tipo y la forma en que se genera el identificador Las propiedades de la clase y su tipo Cabe mencionar que Hibernate puede generar de varias formas un identificador y que en las propiedades se pueden especificar otras cosas tales como: el nombre de la columna, la integridad referencial, etc.
20 Creación del archivo log2j.properties La librería log2j sirve para realizar trazas en una aplicación, estas trazas las puede enviar directamente a una bitácora en disco o en consola, para realizar cualquiera de estas operaciones es necesario configurar un archivo llamado log2j.properties, para el objetivo de esta aplicación solo es necesario se requiere que se cree este archivo en el directorio de src y se agregue el siguiente texto: log4j.rootcategory=info, A1 log4j.appender.a1=org.apache.log4j.consoleappender log4j.appender.a1.layout=org.apache.log4j.patternlayout log4j.appender.a1.layout.conversionpattern=%-5p - %m%n Hasta este momento deberíamos tener un proyecto similar al siguiente: Ilustración 11: Vista del proyecto Automatización del proceso de construcción con ANT En el directorio raíz de nuestra aplicación vamos a crear un archivo build.xml para que ANT automatice el proceso de construcción de la aplicación.
21 En este archivo vamos a requerir de las siguientes tareas: init: Declaración de las propiedades que empleara el sistema prepare: Creación de los directorios copy-resources: Copia los archivos de configuración de Hibernate y log2j al directorio bin del proyecto compile: Compila el proyecto run: Corre la aplicación y agrega los parámetros necesarios El archivo build.xml debe verse de la siguiente manera: <project name="prueba de hibernate" default="run"> <target name="init"> <property name="src.dir" value="src"/> <property name="classes.dir" value="bin"/> <property name="lib.dir" value="lib"/> <property name="mainclass" value="mx.uam.hibernate.manejadorlibro"/> <path id="classpath"> <pathelement location="${classes.dir}" /> <fileset dir="${lib.dir}"> <include name="*.jar" /> </fileset> </path> </target> <target name="prepare" depends="init"> <mkdir dir="${classes.dir}"/> <mkdir dir="${lib.dir}"/> </target> <target name="compile" depends="copy-resources"> <javac srcdir="${src.dir}" destdir="${classes.dir}"> <classpath refid="classpath" /> </javac> </target> <target name="copy-resources" depends="prepare"> <copy todir="${classes.dir}"> <fileset dir="${src.dir}"> <exclude name="**/*.java"/>
22 </fileset> </copy> </target> <target name="run" depends="compile"> <java classname="${mainclass}" fork="true"> <arg value="agrega"/> <arg value="tutorial"/> <arg value="ingsw"/> <classpath refid="classpath" /> </java> </target> </project> Correr la aplicación Para poder correr la aplicación vamos a abrir la vista de ANT, para esto vamos a al menú principal y seleccionamos Window->Show View->Ant, después seleccionamos el archivo build.xml y lo arrastramos hasta colocarlo en la vista de ANT. Ilustración 12: Vista de ANT con las tareas declaradas en el archivo build.xml El siguiente para es dar doble click cobre la tarea run y en la consola debe desplegarse algo similar a: Buildfile: C:\home\hsqldb\hibernate\PruebaHibernate\build.xml init: prepare: copy-resources: compile: run: [java] Inicalizando Hibernate [java] INFO - Hibernate 3.0.2
23 [java] INFO - hibernate.properties not found [java] INFO - using CGLIB reflection optimizer [java] INFO - using JDK 1.4 java.sql.timestamp handling [java] INFO - configuring from resource: /hibernate.cfg.xml [java] INFO - Configuration resource: /hibernate.cfg.xml [java] INFO - Mapping resource: mx/uam/hibernate/data/libro.hbm.xml [java] INFO - Mapping class: mx.uam.hibernate.libro -> LIBRO [java] INFO - Configured SessionFactory: null [java] INFO - processing extends queue [java] INFO - processing collection mappings [java] INFO - processing association property references [java] INFO - processing foreign key constraints [java] INFO - Using Hibernate built-in connection pool (not for production use!) [java] INFO - Hibernate connection pool size: 20 [java] INFO - autocommit mode: false [java] INFO - using driver: org.hsqldb.jdbcdriver at URL: jdbc:hsqldb:data/test [java] INFO - connection properties: {user=sa, password=****} [java] INFO - RDBMS: HSQL Database Engine, version: [java] INFO - JDBC driver: HSQL Database Engine Driver, version: [java] INFO - Using dialect: org.hibernate.dialect.hsqldialect [java] INFO - JDBC batch size: 15 [java] INFO - JDBC batch updates for versioned data: disabled [java] INFO - Scrollable result sets: enabled [java] INFO - JDBC3 getgeneratedkeys(): disabled [java] INFO - Aggressive release : disabled [java] INFO - Default batch fetch size: 1 [java] INFO - Generate SQL with comments: disabled [java] INFO - Order SQL updates by primary key: disabled [java] INFO - Query translator: org.hibernate.hql.ast.astquerytranslatorfactory [java] INFO - Using ASTQueryTranslatorFactory [java] INFO - Query language substitutions: {} [java] INFO - Transaction strategy: org.hibernate.transaction.jdbctransactionfactory [java] INFO - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended) [java] INFO - Automatic flush during beforecompletion(): disabled [java] INFO - Automatic session close at end of transaction: disabled [java] INFO - Second-level cache: enabled [java] INFO - Query cache: disabled [java] INFO - Cache provider: org.hibernate.cache.hashtablecacheprovider [java] INFO - Optimize cache for minimal puts: disabled [java] INFO - Structured second-level cache entries: enabled [java] INFO - Echoing all SQL to stdout [java] INFO - Statistics: disabled [java] INFO - Deleted entity synthetic identifier rollback: disabled [java] INFO - Default entity-mode: pojo [java] INFO - building session factory [java] INFO - Not binding factory to JNDI, no JNDI name configured [java] INFO - Using dialect: org.hibernate.dialect.hsqldialect [java] INFO - Using Hibernate built-in connection pool (not for production use!) [java] INFO - Hibernate connection pool size: 20
24 [java] INFO - autocommit mode: false [java] INFO - using driver: org.hsqldb.jdbcdriver at URL: jdbc:hsqldb:data/test [java] INFO - connection properties: {user=sa, password=****} [java] INFO - Running hbm2ddl schema update [java] INFO - fetching database metadata [java] INFO - updating schema [java] INFO - processing extends queue [java] INFO - processing collection mappings [java] INFO - processing association property references [java] INFO - processing foreign key constraints [java] INFO - table found: LIBRO [java] INFO - columns: [titulo, uid, autor] [java] INFO - foreign keys: [] [java] INFO - indexes: [sys_pk_libro] [java] INFO - schema update complete [java] INFO - cleaning up connection pool: jdbc:hsqldb:data/test [java] INFO - Checking 0 named queries [java] terminado la inicializacion de Hibernate [java] Hibernate: insert into LIBRO (titulo, autor, uid) values (?,?,?) BUILD SUCCESSFUL Total time: 3 seconds Con esto hemos agregado una entrada a la tabla LIBRO con la informacion: Titulo: Tutorial Autor: IngSW Esta es la información que le pasamos al programa en las lineas de ANT de la tarea run: <arg value="agrega"/> <arg value="tutorial"/> <arg value="ingsw"/> Para observar que esta entrada en la tabla ha sido persistida por Hibernate cambiaremos estas lineas por: <arg value="lista"/> Ahora damos doble click en la tarea run y debe aparecer algo similar a: Buildfile: C:\home\hsqldb\hibernate\PruebaHibernate\build.xml init: prepare: copy-resources: compile: run: [java] Inicalizando Hibernate [java] INFO - Hibernate [java] INFO - hibernate.properties not found [java] INFO - using CGLIB reflection optimizer [java] INFO - using JDK 1.4 java.sql.timestamp handling [java] INFO - configuring from resource: /hibernate.cfg.xml [java] INFO - Configuration resource: /hibernate.cfg.xml [java] INFO - Mapping resource: mx/uam/hibernate/data/libro.hbm.xml [java] INFO - Mapping class: mx.uam.hibernate.libro -> LIBRO
25 [java] INFO - Configured SessionFactory: null [java] INFO - processing extends queue [java] INFO - processing collection mappings [java] INFO - processing association property references [java] INFO - processing foreign key constraints [java] INFO - Using Hibernate built-in connection pool (not for production use!) [java] INFO - Hibernate connection pool size: 20 [java] INFO - autocommit mode: false [java] INFO - using driver: org.hsqldb.jdbcdriver at URL: jdbc:hsqldb:data/test [java] INFO - connection properties: {user=sa, password=****} [java] INFO - RDBMS: HSQL Database Engine, version: [java] INFO - JDBC driver: HSQL Database Engine Driver, version: [java] INFO - Using dialect: org.hibernate.dialect.hsqldialect [java] INFO - JDBC batch size: 15 [java] INFO - JDBC batch updates for versioned data: disabled [java] INFO - Scrollable result sets: enabled [java] INFO - JDBC3 getgeneratedkeys(): disabled [java] INFO - Aggressive release : disabled [java] INFO - Default batch fetch size: 1 [java] INFO - Generate SQL with comments: disabled [java] INFO - Order SQL updates by primary key: disabled [java] INFO - Query translator: org.hibernate.hql.ast.astquerytranslatorfactory [java] INFO - Using ASTQueryTranslatorFactory [java] INFO - Query language substitutions: {} [java] INFO - Transaction strategy: org.hibernate.transaction.jdbctransactionfactory [java] INFO - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended) [java] INFO - Automatic flush during beforecompletion(): disabled [java] INFO - Automatic session close at end of transaction: disabled [java] INFO - Second-level cache: enabled [java] INFO - Query cache: disabled [java] INFO - Cache provider: org.hibernate.cache.hashtablecacheprovider [java] INFO - Optimize cache for minimal puts: disabled [java] INFO - Structured second-level cache entries: enabled [java] INFO - Echoing all SQL to stdout [java] INFO - Statistics: disabled [java] INFO - Deleted entity synthetic identifier rollback: disabled [java] INFO - Default entity-mode: pojo [java] INFO - building session factory [java] INFO - Not binding factory to JNDI, no JNDI name configured [java] INFO - Using dialect: org.hibernate.dialect.hsqldialect [java] INFO - Using Hibernate built-in connection pool (not for production use!) [java] INFO - Hibernate connection pool size: 20 [java] INFO - autocommit mode: false [java] INFO - using driver: org.hsqldb.jdbcdriver at URL: jdbc:hsqldb:data/test [java] INFO - connection properties: {user=sa, password=****} [java] INFO - Running hbm2ddl schema update [java] INFO - fetching database metadata [java] INFO - updating schema
26 [java] INFO - processing extends queue [java] INFO - processing collection mappings [java] INFO - processing association property references [java] INFO - processing foreign key constraints [java] INFO - table found: LIBRO [java] INFO - columns: [titulo, uid, autor] [java] INFO - foreign keys: [] [java] INFO - indexes: [sys_pk_libro] [java] INFO - schema update complete [java] INFO - cleaning up connection pool: jdbc:hsqldb:data/test [java] INFO - Checking 0 named queries [java] terminado la inicializacion de Hibernate [java] Hibernate: select libro0_.uid as uid, libro0_.titulo as titulo0_, libro0_.autor as autor0_ from LIBRO libro0_ [java] Libro: Tutorial, Autor: IngSW BUILD SUCCESSFUL Total time: 3 seconds Aplicación sencilla utilizando Hibernate y Derby En el ejemplo anterior utilizamos HSQL como el medio para hacer la persistencia de nuestro objeto de dominio Libro, pero esto no significa que sea la única forma de lograr hacer persistir a nuestros objetos. Hibernate conoce varios dialectos de SQL que permiten realizan la conexión entre Hibernate y otros manejadores de bases de datos. En este caso vamos a empleas Derby para realizar la persistencia de nuestro objeto de dominio. El primer paso es obtener Derby de la pagina que ya se menciono con anterioridad, después se descomprime el zip, dentro de la carpeta db-derby bin que se genera al descomprimir el jars se encuentra la carpeta lib que contiene varios jars, de esta carpeta copias el jar derby.jar a la carpeta lib de nuestro proyecto. Ahora abrimos Eclipse y agregamos al Build Path el jar que acabamos de copiar.
27 Ilustración 13: JAR de Derby en nuestro proyecto Configuración de el archivo hibernate.cfg.xml Para poder hacer uso de Derby requerimos decirle a Hibernate como comunicarse con Derby, para lograr esto requerimos modificar el archivo de configuración de Hibernate. Para realizar la comunicación con Derby se necesitan modificar las siguientes propiedades con los valores dados: hibernate.connection.driver_class -> org.apache.derby.jdbc.embeddeddriver hibernate.connection.url -> jdbc:derby:build/derby/hibernate;create=true dialect -> org.hibernate.dialect.derbydialect El archivo de configuración de Hibernate deberia quedar parecido a:
28 <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" " <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.embeddeddriver</prop erty> <property name="hibernate.connection.url">jdbc:derby:build/derby/hibernate;create=true</prope rty> <property name="hibernate.connection.username">sa</property> <property name="hibernate.connection.password"></property> <property name="dialect">org.hibernate.dialect.derbydialect</property> <property name="show_sql">true</property> <property name="transaction.factory_class"> org.hibernate.transaction.jdbctransactionfactory </property> <property name="hibernate.cache.provider_class"> org.hibernate.cache.hashtablecacheprovider </property> <property name="hibernate.hbm2ddl.auto">update</property> <mapping resource="mx/uam/hibernate/data/libro.hbm.xml"/> </session-factory> </hibernate-configuration> Lo que le decimos a Hibernate es: Que Driver utilice para comunicarse con Derby Que URL utilizara para comunicarse En que dialecto debe hablar Esta es la única modificación que se le debe realizar a la aplicación para que funcione, después de esto debe funcionar tal y como funcionaba con HSQL, a excepción de que la información que contenía HSQL evidentemente no esta en Derby Corriendo la aplicación Una vez realizadas las modificaciones mencionadas modificamos los parámetros que se le pasan al programa para que agregue una entrada en la base de datos Derby. Ejemplo:
29 <target name="run" depends="compile"> </target> <java classname="${mainclass}" fork="true"> </java> <arg value="agrega"/> <arg value="tutorial"/> <arg value="ingsw"/> <classpath refid="classpath" /> Ahora salvamos el archivo build.xml y en la vista de ANT damos doble click sobre la tarea run, esto debe generar una entrada en la base de datos y dar la siguiente traza: Buildfile: C:\home\hsqldb\hibernate\PruebaHibernate\build.xml init: prepare: copy-resources: compile: run: [java] Inicalizando Hibernate [java] INFO - Hibernate [java] INFO - hibernate.properties not found [java] INFO - using CGLIB reflection optimizer [java] INFO - using JDK 1.4 java.sql.timestamp handling [java] INFO - configuring from resource: /hibernate.cfg.xml [java] INFO - Configuration resource: /hibernate.cfg.xml [java] INFO - Mapping resource: mx/uam/hibernate/data/libro.hbm.xml [java] INFO - Mapping class: mx.uam.hibernate.libro -> LIBRO [java] INFO - Configured SessionFactory: null [java] INFO - processing extends queue [java] INFO - processing collection mappings [java] INFO - processing association property references [java] INFO - processing foreign key constraints [java] INFO - Using Hibernate built-in connection pool (not for production use!) [java] INFO - Hibernate connection pool size: 20 [java] INFO - autocommit mode: false [java] INFO - using driver: org.apache.derby.jdbc.embeddeddriver at URL: jdbc:derby:build/derby/hibernate;create=true [java] INFO - connection properties: {user=sa, password=****} [java] INFO - RDBMS: Apache Derby, version: [java] INFO - JDBC driver: Apache Derby Embedded JDBC Driver, version: [java] INFO - Using dialect: org.hibernate.dialect.derbydialect [java] INFO - Scrollable result sets: enabled [java] INFO - JDBC3 getgeneratedkeys(): disabled [java] INFO - Aggressive release : disabled [java] INFO - Default batch fetch size: 1 [java] INFO - Generate SQL with comments: disabled [java] INFO - Order SQL updates by primary key: disabled [java] INFO - Query translator: org.hibernate.hql.ast.astquerytranslatorfactory [java] INFO - Using ASTQueryTranslatorFactory
30 [java] INFO - Query language substitutions: {} [java] INFO - Transaction strategy: org.hibernate.transaction.jdbctransactionfactory [java] INFO - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended) [java] INFO - Automatic flush during beforecompletion(): disabled [java] INFO - Automatic session close at end of transaction: disabled [java] INFO - Second-level cache: enabled [java] INFO - Query cache: disabled [java] INFO - Cache provider: org.hibernate.cache.hashtablecacheprovider [java] INFO - Optimize cache for minimal puts: disabled [java] INFO - Structured second-level cache entries: enabled [java] INFO - Echoing all SQL to stdout [java] INFO - Statistics: disabled [java] INFO - Deleted entity synthetic identifier rollback: disabled [java] INFO - Default entity-mode: pojo [java] INFO - building session factory [java] INFO - Not binding factory to JNDI, no JNDI name configured [java] INFO - Using dialect: org.hibernate.dialect.derbydialect [java] INFO - Using Hibernate built-in connection pool (not for production use!) [java] INFO - Hibernate connection pool size: 20 [java] INFO - autocommit mode: false [java] INFO - using driver: org.apache.derby.jdbc.embeddeddriver at URL: jdbc:derby:build/derby/hibernate;create=true [java] INFO - connection properties: {user=sa, password=****} [java] INFO - Running hbm2ddl schema update [java] INFO - fetching database metadata [java] INFO - updating schema [java] INFO - processing extends queue [java] INFO - processing collection mappings [java] INFO - processing association property references [java] INFO - processing foreign key constraints [java] INFO - table not found: LIBRO [java] INFO - table not found: LIBRO [java] INFO - schema update complete [java] INFO - cleaning up connection pool: jdbc:derby:build/derby/hibernate;create=true [java] INFO - Checking 0 named queries [java] terminado la inicializacion de Hibernate [java] Hibernate: insert into LIBRO (titulo, autor, uid) values (?,?,?) BUILD SUCCESSFUL Total time: 6 seconds Ahora para probar que se agrego la entrada en la base de datos cambiando los argumentos de la tarea run por: <arg value="lista"/> Esto genera una traza parecida a la siguiente:
31 Buildfile: C:\home\hsqldb\hibernate\PruebaHibernate\build.xml init: prepare: copy-resources: compile: run: [java] Inicalizando Hibernate [java] INFO - Hibernate [java] INFO - hibernate.properties not found [java] INFO - using CGLIB reflection optimizer [java] INFO - using JDK 1.4 java.sql.timestamp handling [java] INFO - configuring from resource: /hibernate.cfg.xml [java] INFO - Configuration resource: /hibernate.cfg.xml [java] INFO - Mapping resource: mx/uam/hibernate/data/libro.hbm.xml [java] INFO - Mapping class: mx.uam.hibernate.libro -> LIBRO [java] INFO - Configured SessionFactory: null [java] INFO - processing extends queue [java] INFO - processing collection mappings [java] INFO - processing association property references [java] INFO - processing foreign key constraints [java] INFO - Using Hibernate built-in connection pool (not for production use!) [java] INFO - Hibernate connection pool size: 20 [java] INFO - autocommit mode: false [java] INFO - using driver: org.apache.derby.jdbc.embeddeddriver at URL: jdbc:derby:build/derby/hibernate;create=true [java] INFO - connection properties: {user=sa, password=****} [java] INFO - RDBMS: Apache Derby, version: [java] INFO - JDBC driver: Apache Derby Embedded JDBC Driver, version: [java] INFO - Using dialect: org.hibernate.dialect.derbydialect [java] INFO - Scrollable result sets: enabled [java] INFO - JDBC3 getgeneratedkeys(): disabled [java] INFO - Aggressive release : disabled [java] INFO - Default batch fetch size: 1 [java] INFO - Generate SQL with comments: disabled [java] INFO - Order SQL updates by primary key: disabled [java] INFO - Query translator: org.hibernate.hql.ast.astquerytranslatorfactory [java] INFO - Using ASTQueryTranslatorFactory [java] INFO - Query language substitutions: {} [java] INFO - Transaction strategy: org.hibernate.transaction.jdbctransactionfactory [java] INFO - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended) [java] INFO - Automatic flush during beforecompletion(): disabled [java] INFO - Automatic session close at end of transaction: disabled [java] INFO - Second-level cache: enabled [java] INFO - Query cache: disabled [java] INFO - Cache provider: org.hibernate.cache.hashtablecacheprovider [java] INFO - Optimize cache for minimal puts: disabled [java] INFO - Structured second-level cache entries: enabled [java] INFO - Echoing all SQL to stdout [java] INFO - Statistics: disabled [java] INFO - Deleted entity synthetic identifier rollback: disabled
32 [java] INFO - Default entity-mode: pojo [java] INFO - building session factory [java] INFO - Not binding factory to JNDI, no JNDI name configured [java] INFO - Using dialect: org.hibernate.dialect.derbydialect [java] INFO - Using Hibernate built-in connection pool (not for production use!) [java] INFO - Hibernate connection pool size: 20 [java] INFO - autocommit mode: false [java] INFO - using driver: org.apache.derby.jdbc.embeddeddriver at URL: jdbc:derby:build/derby/hibernate;create=true [java] INFO - connection properties: {user=sa, password=****} [java] INFO - Running hbm2ddl schema update [java] INFO - fetching database metadata [java] INFO - updating schema [java] INFO - processing extends queue [java] INFO - processing collection mappings [java] INFO - processing association property references [java] INFO - processing foreign key constraints [java] INFO - table found:.sa.libro [java] INFO - columns: [titulo, uid, autor] [java] INFO - foreign keys: [] [java] INFO - indexes: [sql ] [java] INFO - schema update complete [java] INFO - cleaning up connection pool: jdbc:derby:build/derby/hibernate;create=true [java] INFO - Checking 0 named queries [java] terminado la inicializacion de Hibernate [java] Hibernate: select libro0_.uid as uid, libro0_.titulo as titulo0_, libro0_.autor as autor0_ from LIBRO libro0_ [java] INFO - cleaning up connection pool: jdbc:derby:build/derby/hibernate;create=true [java] WARN - SQL Warning: 10000, SQLState: 01J01 [java] WARN - Database 'build/derby/hibernate' not created, connection made to existing database instead. [java] Libro: Tutorial, Autor: IngSW BUILD SUCCESSFUL Total time: 5 seconds Creando aplicaciones con Hibernate 1 Hasta este momento hemos creado una aplicación sencilla empleando Hibernate, pero hasta ahora no hemos entrado en detalles de como están estructurados los archivos de mapeo de Hibernate, en esta sección vamos a detallar estos archivos y de que manera podemos hacer que dos o mas tablas interactúen. 1 Los datos tomados en esta sección están basados en el capitulo 6 del libro Pro Hibernate 3 que se encuentra en books24x7
33 Anatomía de los archivo de mapeo Tipos de datos soportados por Hibernate Tipo de dato de Hibernate int short long float double character byte boolean string date, time calendar big_decimal big_integer locale timezone currency class binary text serializable clob blob Equivalencia a tipo de datos Java int, java.lang.integer short, java.lang.short long, java.lang.long float, java.lang.float double, java.lang.double char, java.lang.character byte, java.lang.byte boolean, java.lang,boolean java.lang.stirng java.util.date java.util.calendar java.math.bigdecimal java.math.biginteger java.util.locale java.util.timezone java.util.currency java.lang.class byte[] java.lang.string java.io.serializable java.sql.clob java.sql.blob Tabla 1: Tipos de datos en Hibernate Atributos del elemento <hibernate-mapping> Este es el elemento central y permite establecer los comportamientos a los demás elementos
34 Atributo Valores Default Descripción auto-import true,false true Permite usar nombres de clases no cualificados en los queries de Hibernate. catalog El catalogo de la base de datos al cual se aplican los queries default-access property Tipo de acceso a los datos de la clase, puesto en property se utilizan los métodos de get y set con el valor asignado a name del elemento property default-cascade none Define como los cambios en el objeto afectan a los objetos relacionados con el. default-lazy true,false true Define si la instanciación perezosa es utilizada por default package schema El package de donde se hacen los import de las clases El esquema de la base de datos en donde se aplican los queries Tabla 2: Tag Hibernate Mapping Atributos del elemento <class> En este elemento se describe la relación entre el objeto Java y la base de datos.
35 Atributo Valores Default Descripción abstract true, false false Este atributo solo debe tener el valor true si la clase es abstracta batch-size 1 El numero de objetos que pueden ser obtenidos con el mismo id de la clase. catalog Ya descrito en Tabla 2 check SQL para crear una sentencia multirow check para generar un esquema discriminatorvalue null, not-null Valor usado para distinguir entre subclases idénticas de un tipo persistente común. dynamic-insert true, false false Si es true, columnas nulas aparecerán al ejecutar un comando INSERT cuando no ha colocado un valor por default. dynamic-update true, false false Si es true, columnas sin cambios aparecerán al ejecutar un comando UPDATE entity-name Nombre que se usara en lugar del nombre de clase. lazy true, false Se utiliza para habilitar y deshabilitar el cargado perezoso. mutable true, false true Indica si la clase es mutable name El nombre completo de la clase que se hará persistir. optimistic-lock none, version, dirty, all version Especifica la estrategia de optimistic lock que sera usada. persister Permite que un objeto ClassPersister sea usado al hacer persistir esta clase. polymorphism implicit, explicit implicit Determina el tipo de polimorfismo que sera usado, el polimorfismo implícito permite regresar instancias de la clase cuando la superclase sea utilizada en el query proxy Especifica una clase o interface que sera utilizada como proxy para la inicialización perezosa. rowid Indica que identificador de columna debe ser usado schema Ya descrito en Tabla 2
36 Atributo Valores Default Descripción true, false false Si es true, Hibernate realiza un SELECT antes de un UPDATE para asegurarse que la actualización es necesaria. table El nombre de la tabla asociada con la clase. where Condición de la sentencia SQL WHERE que sera usada al recuperar objetos. Tabla 3: Tag Class Atributos del elemento <id> Este elemento permite definir la llave primaria de la tabla, este es un elemento obligatorio Atributo Valor Default Descripción access Indica como se debe acceder a las propiedades, si es puesto en field, se accede directamente a los atributos de la clase, si es property se accede por los métodos de get y set. Se puede especificar una clase de tipo PropertyAccesor para definir otros tipos de acceso column El nombre de la columna que servirá de llave primaria. length El tamaño de la columna. name El nombre del atributo de la clase que representa la llave primaria type Algún tipo de dato soportado por Hibernate. select-beforeupdate unsavedvalue El valor que el atributo debe tomar cuando una instancia de la clase ha sido creado. Es obligatorio. Tabla 4: Tag Id Atributos del elemento <generator> Al establecer una llave primaria se debe especificar la forma en que esta se genera, Hibernate tiene implementadas varias formas de generar la llave primaria, pero no todas las formas son portables a todos los manejadores de bases de datos.
37 En la Tabla 5 se muestran los formas en que Hibernate genera llaves primarias y si son portables o no. Nombre guid Descripción Genera un identificador globalmente único, no es portable. hilo Genera identificadores únicos empleando una tabla y una columna de la base de datos, es portable. identity Soporta el tipo de columna identity proporcionado por algunos manejadores de bases de datos increment Genera llaves que empiezan en 1 y que se van incrementando en 1 cada vez que se agrega un nuevo registro a la base de datos, puede ser aplicado a los tipos int, short y long. Es portable native Selecciona entre sequence, identity e hilo como la forma de generar la llave primaria. sequence Soporta el tipo sequence proporcionado por algunos manejadores de bases de datos. uuid La llave se compone de la dirección IP local, la hora de JVM, lo hora del sistema y un valor continuo, no garantiza que la llave primaria sea única. Tabla 5: Tag Generator Atributos del elemento <property> Esta propiedad permite especificar los atributos de la clase que no se relacionan con otras clases del modelo de dominio.
38 Atributo Valor Default Descripción access Ya descrito en Tabla 4 column El nombre de la columna que almacenara el valor del atributo, por default el nombre de la columna es el nombre del atributo. formula Un query SQL que representa una propiedad calculada dinamicamente. index El nombre de un index relacionado con esta columna. insert true, false true Especifica si en la creación de una instancia de la clase el atributo relacionado con esta propiedad debe ser almacenado. lazy true, false false Ya descrito en Tabla 3 length Longitud de la columna. name Nombre del atributo en la clase que debe empezar con minúscula, este atributo es obligatorio. not-null true, false false Especifica si se puede almacenar un valor nulo. optimisticlock true, false true Ya descrito en Tabla 3 precision Permite especificar la presición del dato numérico. scale Permite especificar la escala del dato numérico. type Algún tipo de dato soportado por Hibernate. unique true, false false Indica si valores duplicados son permitidos. update true, false true Especifica si en la actualización del atributo de la clase esta columna también es modificada. Tabla 6: Tag Property Relaciones entre tablas Como mencionamos antes las aplicaciones de la vida real no están descritas por tablas independientes,
39 sino por tablas que interactúen entre si, el problema ahora es como hacemos que Hibernate maneje estas relaciones entre las tablas. Hasta donde nosotros sabemos la interacción entre tablas se hace colocando una llave foránea en la tabla que deseamos que interactúe con otra, esta llave foránea corresponde a la llave primaria de la otra tabla, sabemos también, que la interacción entre tablas debe tener una cardinalidad y que nosotros debemos manejar esta cardinalidad (en una relación n a n, nosotros debemos definir el indice que administra la relación). En Hibernate la adminstración de las relaciones entre tablas es mas sencilla ya que tiene elementos que ademas de definir un atributo como llave foránea le asignan la cardinalidad de la relación, estos elementos son descritos en las siguientes secciones con los atributos que pueden tener. Atributos del elemento <one-to-one> Esta relación expresa que el atributo de la clase esta relacionado con un solo atributo de otra.
40 Atributo Valor Default Descripción access Ya descrito en Tabla 4 batch-size Ya descrito en Tabla 3 cascade Determina como los cambios en la entidad padre afectan a los objetos relacionados. catalog Ya descrito en Tabla 2 check Ya descrito en Tabla 3 fetch join, select, subselect El modo con el que el elemento sera recuperado inverse true, false false Especifica si la relación es bidireccional lazy true, false Ya descrito en Tabla 3 name Le asigna un nombre a la entidad (requerido en caso de que el mapa sea dinámico). optimistic-lock true, false true Ya descrito en Tabla 3 outer-join true, false, auto Especifica si un outer-join sera usado persister Especifica que ClassPersister sera usado para sobreescribir el que se encuentra definido por default schema Ya descrito en Tabla 2 table El nombre de la tabla con la que esta asociado este atributo. where Ya descrito en Tabla 3 Tabla 7: Tag one-to-one Atributos del elemento <one-to-many> Especifica que un atributo de la clase esta relacionado con 0 o muchos elementos de otra clase
41 Atributo Valor Default Descripción access Ya descrito en Tabla 4 cascade Ya descrito en Tabla 7 class El tipo del atributo, es decir, el nombre de la clase a la que se hace referencia. column El nombre que tendrá la columna que almacenara al atributo entity-name El nombre de la entidad asociada al atributo. fetch join, select Ya descrito en Tabla 7 foreign-key El nombre de la llave foránea generada por esta asociación. Por default Hibernate asigna un nombre index Indica el orden de la entidades cuando sean recuradas por la tabla inversa. insert true, false true Puesto en false, si al atributo ya tiene un valor asignado advierte cuando se intente cambiar. lazy true, false false Ya descrito en Tabla 3 name El nombre del atributo en la clase. not-found exception, ignore exception El comportamiento que se toma cuando la entidad no existe not-null true, false false Especifica si se permiten valores nulos optimisticlock true, false true Ya descrito en Tabla 3 outer-join true, false, auto Ya descrito en Tabla 7 property-ref Si en la relación no se utiliza la llave primaria, este atributo se utiliza para indicar con que propiedad se tiene la relación. unique true, false false Especifica si se permiten identificadores duplicados
42 Atributo Valor Default Descripción update true, false true Ya descrito en Tabla 6 Tabla 8: Tag one-to-many Atributos del elemento <many-to-many> Especifica que un atributo de la clase tiene una relación de muchos a muchos con un atributo de otra clase. Atributo Valor Default Descripción column El nombre que tendrá la columna que almacenara al atributo class El tipo del atributo, es decir, el nombre de la clase a la que se hace referencia. outer-join true, false, auto Ya descrito en Tabla 7 Tabla 9: Tag many-to-many Es común que los atributos que están relacionados con otros atributos de otras clases estén almacenados en colecciones de datos, por ejemplo: public class Prestamo{ private Set<Usuario> listadeudores = new HashSet<Usuario>(); // métodos de get y set } Hibernate proporciona soporte para poder hacer persistir a estos elementos y hacer mas fácil su manipulación. En la siguiente sección mostraremos las colecciones que soporta Hibernate, como se describen en el archivo de mapeo y como podemos trabajar con ellas. Atributos comunes de los elementos de colección Los objetos de colección tienen varios atributos en común, para no estar repitiendo la información la Tabla 10 muestra la información común a los objetos de colección soportados por Hibernate.
43 Atributo Valor Default Descripción access Ya descrito en Tabla 4 batch-size Ya descrito en Tabla 3 cascade Ya descrito en Tabla 7 catalog Ya descrito en Tabla 2 check Ya descrito en Tabla 3 fetch join, select, subselect Ya descrito en Tabla 7 lazy true, false Ya descrito en Tabla 3 name El nombre que tiene el atributo en la clase, debe empezar con minúscula optimistic-lock true, false true Ya descrito en Tabla 3 outer-join true, false, auto Ya descrito en Tabla 7 persister Ya descrito en Tabla 7 schema Ya descrito en Tabla 2 table El nombre de la tabla asociada con este atributo. where Ya descrito en Tabla 3 Tabla 10: Atributos de los elementos de colección Atributos del elemento <set> Este objeto es el equivalente a la interfaz java.util.set, como en este objeto no se permiten objetos idénticos, por lo que se recomienda sobrecargar los métodos de equals y hashcode, para determinar que es un objeto idéntico que es un objeto igual.
44 Atributo Valor Default Descripción inverse true, false false Ya descrito en Tabla 7 order-by Especifica un criterio SQL para ordenar a los atributos cuando se recuperan de la base de datos. sort Especifica la clase Collection que sera usada, puede tomar los valores de unsorter, natural o cualquier otra clase Comparator. Tabla 11: Tag Set Ejemplo del uso de un elemento Set en una relación unidireccional de muchos a muchos sin objetos replicados: Supongamos que estamos mapeando la siguiente relación: Usuario -idusuario 1..* 1..* -idlibro Libro Ilustración 14: Ejemplo de uso de Set Nota: Cabe mencionar que esto es solo un ejemplo y que por comodidad se obligo a que sea unidireccional. En la clase Usuario existe el atributo: private Set<Libro> librosprestados = new HashSet<Libro>(); En el archivo Usuario.hbm.xml debe agregarse el siguiente tag: <set name= librosprestados table= Prestamo lazy= false > </set> <key column= idusuario /> <many-to-many class= mx.uam.ayd.biblioteca.libro column= idlibro /> En el tag Set se especifica el nombre del atributo en la clase (name), la tabla que se asocia como indice de la relación (table), ya que en las relaciones de muchos a muchos es necesario contar con uno, y si los objetos están en memoria o no (lazy). En el tag Key se especifica la columna que se usa como llave primaria en la tabla. En el tag many-to-many se espacifica con que clase se relaciona y que columna usa como llave primaria.
45 Atributos del elemento <list> Es el equivalente a la interfaz java.util.list, este objeto permite objetos replicados. Atributo Valor Default Descripción inverse true, false false Ya descrito en Tabla 7 Tabla 12: Tag List Ejemplo del uso del elemento List en una relación unidireccional de muchos a muchos permitiendo objetos replicados en la asociación: Tomando el mismo ejemplo ilustrado en Ilustración 14, vamos a suponer que ahora existe un atributo de tipo List en la clase Usuario: private List<Libro> librosprestados = new ArrayList<Libro>(); En el archivo Usuario.hbm.xml debe agregarse el siguiente tag: <list name= librosprestados table= Prestamo lazy= false > </list> <key column= idusuario /> <many-to-many class= mx.uam.ayd.biblioteca.libro column= idlibro /> Al parecer no existe diferencia entre Set y List, la diferencia consiste en el contexto de la aplicación y en que Hibernate no soporta que en relaciones bidireccionales en el lado de la relación que tiene cardinalidad muchos que se utilicen listas, mapas o arreglos. 2 Atributos del elemento <idbag> Atributo Valor Default Descripción order-by Ya descrito en Tabla 11 Tabla 13: Tag IdBag Atributos del elemento <map> Es el equivalente a la interfaz java.util.map. 2 Para mas información consultar la pagina
46 Atributo Valor Default Descripción inverse true, false false Ya descrito en Tabla 7 order-by Ya descrito en Tabla 11 sort Ya descrito en Tabla 11 Tabla 14: Tag Map Atributos del elemento <bag> Atributo Valor Default Descripción inverse true, false false Ya descrito en Tabla 7 order-by Ya descrito en Tabla 11 Tabla 15: Tag Bag Relaciones bidireccionales Así como es común que interactúen 2 tablas, también lo es que se pueda navegar en ambos sentidos de la relación, en esta sección vamos a tratar este problema para mostrar como se mapean estas visibilidades empleando Hibernate. Hay que mencionar que Hibernate soporta 2 tipos de asociaciones bidireccionales one-to-many many-to-many por lo que en las 2 siguientes secciones vamos a tratar la forma en que se manejan estas relaciones por medio de un ejemplo y vamos a omitir la descripción de los atributos de cada relación. Relaciones del tipo <one-to-many> Supongamos el siguiente ejemplo: Padre Hijo -idpadre 1 0..* -idhijo Ilustración 15: Ejemplo de relación bidireccional one-to-many
47 En esta relación un objeto Padre puede tener de 0 a muchos Hijos y los Hijos están interesados en conocer a su respectivo Padre. Archivo Padre.hbm.xml: <hibernate-mapping> <class name= package.padre table= Padre > </class> <id name= idpadre type= int > </id> <generator class= increment /> <!-- Otros atributos del Padre --> <set name= hijos inverse= true lazy= false > </set> </hibernate-mapping> Archivo Hijo.hbm.xml: <hibernate-mapping> <key column= idpadre /> <one-to-many class= package.hijo /> <class name= package.hijo table= Hijo > </class> <id name= idhijo type= int > </id> </hibernate-mapping> <generator class= increment /> <!-- Otros atributos del Hijo --> <many-to-one name= padre class= package.padre column= idpadre /> Las cosas que cabe hacer notar es que el padre tiene un atributo: private Set<Hijo> hijos = new HashSet<Hijo>(); que el Hijo tiene un atributo: private Padre padre; y que en el caso del Padre la relación va como one-to-many con inverse = true y que esta relación se invierte en el Hijo a many-to-one (el hecho de que la relación se invierta de esta forma no tiene nda que ver con que inverse sea igual a true). Relaciones del tipo <many-to-many> Supongamos ahora la siguiente relación:
48 Padre Hijo -idpadre 1..* 0..* -idhijo Ilustración 16: Ejemplo relación bidireccional muchos a muchos En esta relación un objeto Padre tiene de 0 a muchos Hijos, y los Hijos tienen al menos un Padre (idealmente solo 2). Archivo Padre.hbm.xml: <hibernate-mapping> <class name="package.padre"> <id name= idpadre type= int > </id> <generator class= increment /> <!-- Otros atributos del Padre --> <set name="hijos" table="hijos" inverse="true" lazy="false"> <key column="idpadre"/> <many-to-many class="package.hijo" column="idhijo"/> </set> </class> </hibernate-mapping> Archivo Hijo.hbm.xml: <hibernate-mapping> <class name="package.hijo"> <id name= idhijo type= int > </id> <generator class= increment /> <!-- Otros atributos del Hijo --> <set name="padres" table="hijos" lazy="false"> <key column="idhijo"/> <many-to-many class="package.padre" column="idpadre"/> </set> </class> </hibernate-mapping> Las cosas que cabe hacer notar es que ahora el Hijo tiene un atributo:
49 private Set<Padre> padres = new HashSet<Padre>(); y que en ambos casos los identificadores de cada clase se encuentran en una misma tabla (Hijos) que Hibernate utiliza y administra como indice. Mapeo de clases y sus relaciones Hasta el momento hemos realizado mapeos de objetos a tablas relacionales empleando relaciones de asociación entre los objetos, pero en algunas ocasiones quisiéramos mapear otros tipos de relaciones entre objetos. Dos de la asociaciones mas empleadas en orientación a objetos son la composición y la herencia, Hibernate permite realizar el mapeo de estas relaciones de forma muy sencilla. En las siguientes 2 secciones emplearemos ejemplos para ilustrar la forma en que se puede realizar el mapeo de relaciones de composición y herencia empleando Hibernate. Mapeo de la relación de composición En la Ilustración 17 se muestra una relación en la que una Persona esta compuesta de un Nombre Persona -idpersona -nombre: Nombre 1 1 Nombre Ilustración 17: Ejemplo de relación de composición El archivo Persona.hbm.xml: <hibernate-mapping> <class name= package.persona" table="persona"> <id name="idpersona" type="string"> <generator class="assigned"/> </id> <!-- Otros atributos de Persona --> <component name="nombre" class="package.name"> <!-- Propiedades de la clase Nombre --> </component> </class> </hibernate-mapping> En esta relación el objeto de tipo Nombre es guardado como un valor no como una entidad, por lo que en la clase no es necesario definir un identificador, pero en la clase Persona se deben definir los getters y setters para el objeto de tipo Nombre. El tag component puede tener los atributos de cualquier otro elemento y ademas define un subelemento llamado <parent> que permite definir una asociación con el objeto que lo contiene. Por ejemplo:
50 Persona -idpersona -nombre: Nombre 1 1 Nombre -personanombrada: Persona Ilustración 18: Ejemplo de relación de composición bidireccional en este caso el archivo de Persona.hbm.xml queda: <hibernate-mapping> <class name= package.persona" table="persona"> <id name="idpersona" type="string"> <generator class="assigned"/> </id> <!-- Otros atributos de Persona --> <component name="nombre" class="package.name"> <parent name="personanombrada"/> <!-- Propiedades de la clase Nombre --> </component> </class> </hibernate-mapping> Con esto permitimos que desde el objeto de tipo Nombre se pueda tener visibilidad con un objeto de tipo Persona. Mapeo de la relación de herencia La Ilustración 19 muestra una relación de herencia entre 3 clases: Empleado -idempleado -nombre Secretaria Administrador Ilustración 19: Ejemplo de relación de Herencia
51 Hibernate soporta 3 formas de mapear este tipo de asociaciones que describiremos a continuación. 1. Una tabla por clase concreta Se mapea cada clase de la relación de herencia como una clase concreta normal, en cada clase se mapean todos los atributos incluyendo los que son heredados. En esta filosofía de mapeado no se mapean interfaces ni clases abstractas. <<table>> Empleado -idempleado -nombre <<table>> Secretaria <<table>> Administrador Ilustración 20: Esquema de la base de datos Desventajas: En las subclases se tienen datos replicados, es decir, que por cada subclase de la relación se deben repetir los datos que son heredados. Los cambios en la superclase afectan a muchas tablas. Ejemplo de como se mapearía la clase Secretaria con esta estrategia Archivo Secretaria.hbm.xml: <hibernate-mapping> <class name= package.secretaria table= Secretaria > </class> <!-- El identificador y el nombre son los atributos que hereda de Empleado --> <id name= id type= int > </id> </hibernate-mapping> 2. Una tabla por subclase <generator class= increment > <property name= nombre tupe= string /> <!-- Otros atributos de Secretaria --> Se mapea cada clase en la relación incluyendo clases abstractas e interfaces. La relación es un de la herencia se convierte en una relación tiene un en el esquema de la base de datos.
52 <<table>> Empleado -idempleado -nombre <<table>> Secretaria <<table>> Administrador Ilustración 21: Conversión de la relación a "tiene un" Ventajas: Desventajas: Es conceptualmente mas fácil de comprender No requiere de cambios complejos en la base de datos cuando se modifica a la superclase Puede resultar en un pobre desempeño de la aplicación si la arquitectura del sistema esta mal planteada. Ejemplo de mapeo de la clase Administrador empleando esta estrategia Archivo Administrador.hbm.xml: <hibernate-mapping> <joined-subclass name= package.administrador extends= package.empleado > <!-- Identificador de la clase Empleado --> <key column= idempleado > <!-- Lista de los atributos de la clase Administrador --> </joined-subclass> </hibernate-mapping> En esta ocasión sustituimos el tag class por el joined-subclass para establecer una relación directa con la superclase, en este tag especificamos cual es la clase que extiende y con el tag key hacemos referencia a los elementos de la superclase que no han sido agregados en este archivo, es decir, no es necesario redefinir los elementos de idempleado y nombre. El tag joined-subclass no puede contener tags de subclass y viceversa.
53 3. Una tabla por jerarquía de la clase. Esta estrategia ponemos en una sola tabla a todos los atributos que existan en la relación de herencia, es decir, realizamos una lista con todos los atributos de todas la clases de la relación de herencia y los mapeamos todos en una sola tabla. A esta tabla le agregamos un elemento discriminador para distinguir el tipo base representado por cada fila en la tabla. <<table>> Empleado -idempleado -nombre -atributosdesecretria -atributosdeadministrador Ilustración 22: Esquema de la base de datos con la estrategia de una tabla por jerarquía Ventajas: Desventajas: Ofrece un mejor desempeño ya que los queries se realizan en una misma tabla y se puede recuperar el objeto mas fácilmente. Los cambios en los atributo solo requieren del cambio de una columna. No es una buena representación de los atributos en las clases. Si el numero de subclases crece también lo hace el numero de columnas. Cada subclase debe definir la clase que extiende y su elemento discriminador. Ejemplo de como se realiza el mapeo con esta estrategia Archivo Empleado.hbm.xml: <hibernate-mapping> <class name="package.empleado" table="empleado"> <!-- Identificador de la superclase --> <id name="idempleado" type="int"> <generator class="increment"/> </id> <!-- Columna que sirve como discriminador del tipo de subclase --> <discriminator column="tipoempleado" type="string"/> <!-- Lista de los atributos de la clase Empleado -->
54 </class> </hibernate-mapping> <!-- Definicion de la subclase Secretaria --> <subclass name="package.secretaria" discriminator-value="secre"> <!-- Lista de los atributos de la clase Secretaia --> </subclass> <!-- Definicion de la subclase Administrador --> <subclass name="package.administrador" discriminator-value="admin"> <!-- Lista de los atributos de la clase Administrador --> </subclass>
55 Referencias En ingles Pro Hibernate 3. Jeff Linwood y Dave Minter. (Este libro se encuentra en books24x7). (Documentación de Hibernate, esta disponible en otros idiomas menos en español). (Da una lista de propiedades para configurar Hibernate con cualquiera de los Manejadores de Bases de Datos que conoce). (FAQ del sitio de Hibernate) En español (Articulo de Francsec Roses Albiol sobre Hibernate). (Tutorial para aprender a manejar Hibernate). (Versión en español del articulo publicado por Jeff Hanson, trata de la persistencia de objetos Java con Hibernate). (Articulo de Martín Pérez Mariñán, que trata sobre manejo de caches y concurrencia con Hibernate). 07b0f7df3a86764d39b7. (Trata sobre problemas de mapeo recursivo de objetos).
Programación Orientada a Objetos con Java
Programación Orientada a Objetos con Java M.C. Jorge Eduardo Ibarra Esquer [email protected] Sobrecarga de métodos Java permite la definición de dos o más métodos que tengan el mismo nombre, dentro de la
Instructor: Gilberto G. Flores Vidaña
Instructor: Gilberto G. Flores Vidaña Lección 1: Introducción a ORMs 1. Conceptos Básicos 2. Las librerías 3. El descriptor 4. Registro de los componente 5. Los mappings Objetivos Conocer las definiciones
Programación Orientada a Objetos Analista Programador Universitario Plan 2008 Año 2010
INTRODUCCION Los objetos usados en aplicaciones JAVA mantienen su estado y comportamiento mientras la aplicación se halle en ejecución. Generalmente se necesita mantener el estado y comportamiento de los
Capítulo 3 Diseño del Sistema de Administración de Información de Bajo Costo para un Negocio Franquiciable
Capítulo 3 Diseño del Sistema de Administración de Información de Bajo Costo para un Negocio Franquiciable 1. Introducción. El Sistema de Administración de Información de un Negocio Franquiciable (SAINF)
CREAR UN SERVICIO WEB BASICO CON JAVA AXIS2. Víctor J. Sosa [email protected]
CREAR UN SERVICIO WEB BASICO CON JAVA AXIS2. Víctor J. Sosa [email protected] En este documento explicaré brevemente cómo construir un servicio web con Java Axis2 y cómo invocarlo desde un cliente
Tutorial: Primeros Pasos con Subversion
Tutorial: Primeros Pasos con Subversion Introducción Subversion es un sistema de control de versiones open source. Corre en distintos sistemas operativos y su principal interfaz con el usuario es a través
RUEDA TORRES DULCE CAROLINA 3CM2 HIBERNATE EN UNA APLICACIÓN WEB
3CM2 HIBERNATE EN UNA APLICACIÓN WEB 8 DE MAYO DE 2012 1. CREACION DE LA BASE DE DATOS Para llevar a cabo esta práctica se utiliza una base de datos MySQL llamada Sakila, una muestra gratis de base de
TUTORIAL DESARROLLO DE APLICACIONES PARA EVOLUTION CON MS ACCESS
TUTORIAL DESARROLLO DE APLICACIONES PARA EVOLUTION CON MS ACCESS 1 Introducción... 3 2 Despliegue de la aplicación de ejemplo... 3 2.1 Requisitos previos... 3 2.2 Despliegue de la aplicación... 3 3 Prueba
Patrones para persistencia (I) Ingeniería del Software II
Patrones para persistencia (I) Ingeniería del Software II 1 Patrones para la construcción del esquema relacional En todos los ejemplos realizaremos transformaciones del siguiente diagrama de clases: Figura
Aviso Legal El presente libro electrónico se distribuye bajo Attribution-NonCommercial- NoDerivs 3.0 Unported
PROGRAMACIÓN ORIENTADA A OBJETOS APLICADA A BASES DE DATOS Por LAURA NOUSSAN LETTRY BrowserSQL MySQL Workbench en Linux (Abril 2015, Mendoza) Aviso Legal El presente libro electrónico se distribuye bajo
Apéndice 5 Manual de usuario de ColeXión. ColeXión 1.0. Manual de usuario
Apéndice 5 Manual de usuario de ColeXión ColeXión 1.0 Manual de usuario Índice 1. Qué es ColeXión?... 2 2. Requerimientos del sistema... 3 3. Instalación de ColeXión... 3 4. Creación de un nuevo esquema...
- Bases de Datos - - Diseño Físico - Luis D. García
- Diseño Físico - Luis D. García Abril de 2006 Introducción El diseño de una base de datos está compuesto por tres etapas, el Diseño Conceptual, en el cual se descubren la semántica de los datos, definiendo
Video 2: Cómo Crear una plantilla para Generar Procedimientos Almacenados
Video 2: Cómo Crear una plantilla para Generar Procedimientos Almacenados A continuación se detallará paso a paso el proceso para generar Procedimientos Almacenados (SQL Stored Procedures) con Amonsys
UNIVERSIDAD DEL ISTMO CAMPUS IXTEPEC LIC. INFORMATICA GRUPO 508 PROCEDIMIENTOS ALMACENADOS EN SQL SERVER 2000
PROCEDIMIENTOS ALMACENADOS EN SQL SERVER 2000 Creación de la base de Datos Pulsamos F5 para Actualizar, y una vez posicionados en nuestra base de datos,se crean los scripts que seran soportados por el
U.E JUAN DE VELASCO CREAR DATOS EN SQL
NOMBRE:LILIAN CAUJA U.E JUAN DE VELASCO CREAR DATOS EN SQL Lo primero que necesitamos para conectarnos al Servidor es el administrador que por defecto en algunas instalaciones no viene incluido, se puede
Práctica sobre compartición de instancias remotas.
Práctica sobre compartición de instancias remotas. Para esta práctica se ha construido un pequeño sistema cliente-servidor que permite la resolución de Sudokus entre varios jugadores. El servidor consta
Practica 11: Conexión de Java con Bases de datos Access
Practica 11: Conexión de Java con Bases de datos Access En esta práctica vamos a crear una base de datos Microsoft Access y luego vamos a conectarnos desde una aplicación java haciendo uso del puente JDBC-ODBC
Tutorial rápido de ObjectDB
Tutorial rápido de ObjectDB M. en C. Sergio Luis Pérez Pérez UAM CUAJIMALPA, MÉXICO, D. F. Trimestre 12-O. Sergio Luis Pérez (UAM CUAJIMALPA) Curso de bases de datos avanzadas 1 / 23 Introducción a ObjectDB
Tutorial de Introducción a Grails
Tutorial de Introducción a Grails Adrián Cepillo Macías 7 de marzo de 01 1 Índice Índice 1 1. Instalación de Grails. Creando nuestra aplicación 3. Importando datos de prueba. Configuración del Data Source
Crear una Activity en Android. Paso por paso
19-03-2014 Crear una Activity en Android. Paso por paso Una breve descripción de qué hacer cuando las herramientas de desarrollo de Android se convierten en nuestros enemigos. A veces, puede pasar que
Guía de para Utilizar Comando Batch File De Carga Múltiple
Guía de para Utilizar Comando Batch File De Carga Múltiple En primer lugar se debe abrir la aplicación Hyperion Strategic Finance ( HSF ) sin aperturar ningún modelo en especial, luego presionar File,
Manual de NetBeans y XAMPP
Three Headed Monkey Manual de NetBeans y XAMPP Versión 1.0 Guillermo Montoro Delgado Raúl Nadal Burgos Juan María Ruiz Tinas Lunes, 22 de marzo de 2010 Contenido NetBeans... 2 Qué es NetBeans?... 2 Instalación
AGREGAR UN EQUIPO A UNA RED Y COMPARTIR ARCHIVOS CON WINDOWS 7
Tutoriales de ayuda e información para todos los niveles AGREGAR UN EQUIPO A UNA RED Y COMPARTIR ARCHIVOS CON WINDOWS 7 Como agregar a una red existente un equipo con Windows 7 y compartir sus archivos
Manual de instalación del cliente JAVA-WS
Manual de instalación del cliente JAVA-WS 1 CONTROL DE CAMBIOS Versión Cambios realizados 1.0 Versión inicial 2 TABLA DE CONTENIDOS 1. Introducción... 4 2. Documentación relacionada... 4 3. Requisitos...
Lo que necesitaremos para programar en Java, será un editor de texto o IDE y la JDK.
Introducción Java surgió en 1991 dentro de la empresa Sun Microsystems como un lenguaje de programación sencillo y universal destinado a electrodomésticos. La reducida potencia de cálculo y memoria de
Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación. IIC1102 Introducción a la Programación
Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación IIC1102 Introducción a la Programación Tutorial eclipse TM Introducción al uso de eclipse TM Contents
Nociones de performance
Maestría en Bioinformática Bases de Datos y Sistemas de Información Nociones de performance Ing. Alfonso Vicente, PMP [email protected] Agenda Conceptos Índices Optimizador Planes de acceso
m047a Curso Programando una Base de Datos SQL Server 2008, 36 h Creación B.D. y Constraints
Crear Una Base De Datos (L12) A TRAVÉS DE LA CONSOLA DE ADMINISTRACIÓN A TRAVÉS DEL ASISTENTE DE BASES DE DATOS (DATABASE WIZARD) A TRAVÉS DE COMANDOS SQL (CREATE DATABASE, CREATE TABLE) Crear Un Grupo
Kosmo Desktop Manual de desarrollo Instalación y configuración del código fuente de Kosmo en Eclipse
Kosmo Desktop Manual de desarrollo Instalación y configuración del código fuente de Kosmo en Eclipse Versión 3.0 02/12/2010 2 3 1 Control de versiones VERSIÓN AUTOR FECHA CAMBIO 1.0 SAIG, S.L. 22/03/2007
Curso de Java POO: Programación orientada a objetos
Curso de Java POO: Programación orientada a objetos Luis Guerra Velasco Curso INEM 02830. Programación en Java Marzo 2010 Índice 1 Introducción a la POO 2 Herencia y polimorfismo 3 Empaquetado de proyectos
SOLUCION PARCIAL TASK SCHEDULER. Task Scheduler
Task Scheduler Se necesita modelar una aplicación que permita definir tareas y ejecutarlas en forma programada. Las tareas pueden ser: La ejecución de programa cualquiera o comando del sistema operativo,
Base de datos relacional
Base de datos relacional Una base de datos relacional es una base de datos que cumple con el modelo relacional, el cual es el modelo más utilizado en la actualidad para modelar problemas reales y administrar
Sistema para el alquiler, control de películas y clientes en una videotienda
CASO DE PRUEBA: Sistema para el alquiler, control de películas y clientes en una videotienda Documento de arquitectura Y servicios Versión Historia de Revisión Fecha Versión Descripción Responsable
TUTORIAL DATA WAREHOUSE SQL Server: ETL Parte II
TUTORIAL DATA WAREHOUSE SQL Server: ETL Parte II Este documento consta de: Pasos generales a seguir Pasos específicos a seguir 2 Pasos generales a seguir Parte I 1. Crear la Base de Datos de la Staging
Ingeniería del Software Arquitectura Física en 3 niveles
Introducción En este laboratorio desplegaremos en 3 niveles físicos una aplicación que verifica si una cuenta y un password son correctos, basada en la que fue presentada en el laboratorio Separación entre
Conociendo el ambiente de programación de Java. M. en C. Erika Vilches
Conociendo el ambiente de programación de Java M. en C. Erika Vilches La variable PATH Una vez que se ha aceptado la licencia del JDK y que se ha instalado satisfactoriamente y antes de poder utilizarlo,
Ejercicios - Persistencia en Android: ficheros y SQLite
Ejercicios - Persistencia en Android: ficheros y SQLite Índice 1 Uso de ficheros (0.5 puntos)...2 2 Persistencia con ficheros (0.5 puntos)...3 3 Base de datos: SQLiteOpenHelper (0.5 puntos)... 3 4 Base
TUTORIAL ACADÉMICO. Programación II- Taller de Programación I Fa.CENA. UNNE
TUTORIAL ACADÉMICO Programación II- Taller de Programación I Fa.CENA. UNNE Eclipse, es un Entorno de Desarrollo Profesional y Gratuito, que puede ser utilizado para varios lenguajes Java, C, C++, PHP,
Tutorial básico del entorno de desarrollo Eclipse.
Tutorial básico del entorno de desarrollo Eclipse. Arrancar Eclipse. Después de descomprimir la aplicación, dar doble clic sobre el ícono ejecutable para arrancar la aplicación. En caso de que se presente
Trabajos de Ampliación. Bases de datos NoSQL.
BASES DE DATOS NoSql Son bases de datos pensadas para aplicaciones que hagan un uso intensivo de la misma. Estas bases de datos permiten una mayor flexibilidad y facilidad a la hora de introducir los datos
RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA
UNED Centro Asociado de Cádiz RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA 1. OBJETOS Cualquier elemento del programa es un objeto. Un programa es un conjunto de objetos que se comunican entre sí
TRABAJO GRUPAL TEMA: COMO CREAR BASE DE DATOS EN SQL
TRABAJO GRUPAL INTEGRANTES: Curso: 3ero C Informática Erika Caisa Erika Córdova Joselyn Rea TEMA: COMO CREAR BASE DE DATOS EN SQL Lo primero que necesitamos para conectarnos al Servidor es el administrador
Registro de traza en Java
Registro de traza en Java [email protected] / [email protected] y qué es la traza? Veremos dentro de poco como crear el objeto log. public int suma(int a, int b) { log.debug( Entrando en suma ); int sum;
UNIVERSIDAD NACIONAL EXPERIMENTAL POLITÉCNICA DE LA FUERZA ARMADA NACIONAL EXTENSIÓN BARQUISIMETO BARQUISIMETO ESTADO. LARA
UNIVERSIDAD NACIONAL EXPERIMENTAL POLITÉCNICA DE LA FUERZA ARMADA NACIONAL EXTENSIÓN BARQUISIMETO BARQUISIMETO ESTADO. LARA SECCIÓN: 15N1- IS REALIZADO POR: BR. BRETE JINETH. BR. SULBARÁN ARMANDO BR. TORREZ
Instalación de Casandra Para instalar cassandra se recomienda tener la última versión de JAVA instalada.
Bases de Datos Avanzadas GUIA PARA CASSANDRA En esta guía se explicara como instalar cassandra, como agregar datos a cassandra usando spoon, y como corregir algunos problemas que puede aparecer. Para esta
Instrucciones para el despliegue de EJBs
Apuntes de J2EE Instrucciones para el despliegue de EJBs Uploaded by Ingteleco http://ingteleco.webcindario.com [email protected] La dirección URL puede sufrir modificaciones en el futuro. Si no
Manual Hibernate. Fecha de creación: 21.03.2003. Revisión 1.0 (22.04.2003) Héctor Suárez González (hsg arroba telecable punto es)
Fecha de creación: 21.03.2003 Revisión 1.0 (22.04.2003) Héctor Suárez González (hsg arroba telecable punto es) http://www.javahispano.org Copyright (c) 2003, Héctor Suárez González. Este documento puede
SQL (Structured Query Language)
SQL (Structured Query Language) El lenguaje de consulta estructurado o SQL (por sus siglas en inglés Structured Query Language) es un lenguaje declarativo de acceso a bases de datos relacionales que permite
Tenemos que instalar los programas de los usuarios también (los anteriormente mencionados) y los siguientes que vamos a nombrar.
TUTORIAL INCEME Programas necesarios PC s usuarios En los ordenadores donde se va a ejecutar INCEME van hacer falta una serie de programas para su funcionamiento. Tendremos que tener los.net Framework
Capítulo 3 Usando GUIDE. 3.1 Acerca de GUIDE
Capítulo 3 Usando GUIDE 3.1 Acerca de GUIDE Las interfaces gráficas de usuario (GUI - Graphical User Interface en inglés), es la forma en que el usuario interactúa con el programa o el sistema operativo
1. Definición. Open Source. Escalable. Alto desempeño. Arquitectura Modular. Producto de licencia de código abierto sin coste adicional.
1. Definición JBoss es un proyecto de código abierto, con el que se consigue un servidor de aplicaciones basado en J2EE, e implementado al 100% en Java. Por lo tanto al estar basado en Java, JBoss puede
Bases de datos relacionales y el modelo entidad-relación
Bases de datos relacionales y el modelo entidad-relación Qué es una base de datos relacional? El sistema gestor de bases de datos El modelo entidad-relación entidad, atributos y elementos (tablas, columnas
PL/SQL. Con PL/SQL vamos a poder programar las unidades de programa de la base de datos Oracle:
PL/SQL (Procedural Language/Structured Query Language) PL/SQL es el lenguaje de programación que proporciona Oracle para extender el SQL estándar con otro tipo de instrucciones y elementos propios de los
BASE DE DATOS QUÉ ES UNA BASE DE DATOS?
BASE DE DATOS BASE DE DATOS QUÉ ES UNA BASE DE DATOS? Una base de datos se puede definir como un conjunto de información relacionada que se encuentra agrupada ó estructurada. Actualmente la mayoría de
Iniciando con Oracle. Índice de contenido. Ingresando a Oracle. Cambiando Su Contraseña. Ingresando un Comando SQL en SQL*Plus
Iniciando con Oracle Índice de contenido Ingresando a Oracle...1 Cambiando Su Contraseña...1 Ingresando un Comando SQL en SQL*Plus...2 Saliendo de SQL*Plus...2 Consiguiendo Ayuda...2 Creación de una Tabla...3
SENTINEL REMOTE CONTROL (S.R.C)
SENTINEL REMOTE CONTROL (S.R.C) Versión G-0.5 Índice de contenidos 0.Consideraciones acerca de este producto...3 1.Objetivo del SRC...3 2.0 Instalación...3 2.1.Parte cliente (gclient)...4 2.1.Parte servidora
Luis Eduardo Peralta Molina Sistemas Operativos Instructor: José Doñe 2010-2940. Como crear un Servidor DHCP en ClearOS
Servidores DHCP Como crear un Servidor DHCP en ClearOS Dynamic Host Configuration Protocol (DHCP) Protocolo de Configuracion Dinamica de Host, es un protocolo de Red que asigna automaticamente informacion
JDBC. Una mini-introducci. introducción
JDBC Una mini-introducci introducción Introducción JDBC (Java DataBase Connectivity) Protocolo para utilizar bases de datos relacionales desde Java Se basa en la utilización n de drivers que implementan
INDICE. 1. Introducción... 4. 2. El panel Entities view... 5. 3. El panel grafico... 6. 4. Barra de botones... 6. 4.1. Botones de Behavior...
MANUAL DE USUARIO INDICE 1. Introducción... 4 2. El panel Entities view... 5 3. El panel grafico... 6 4. Barra de botones... 6 4.1. Botones de Behavior... 7 4.2. Botones de In-agents... 8 4.3. Botones
MANUAL PARA LA ACTUALIZACIÓN Y CREACIÓN DE DEPENDENCIAS EN EL SISTEMA CREG ENTREGA-RECEPCIÓN
MANUAL PARA LA ACTUALIZACIÓN Y CREACIÓN DE DEPENDENCIAS EN EL SISTEMA CREG ENTREGA-RECEPCIÓN Para la configuración de dependencias debe ingresar al menú Configuración del Sistema, después a Dependencias
Resumen. El rol del lenguaje SQL en los SGBDR y en la Relacional. [email protected], [email protected]
El rol del lenguaje SQL en los SGBDR y en la Relacional. [email protected], [email protected] Resumen demandas de almacenamiento y procesamiento de datos. Es el conjunto de estas dos capacidades
Modulo 1 El lenguaje Java
Modulo 1 El lenguaje Java 13 - Codificación en Java Una de las grandes diferencias entre Java y Pascal en cuando a la codificación es que Java se trata de un lenguaje de los llamados case sensitive Esto
Objetos y Clases en Java. ELO 329: Diseño y Programación Orientados a Objetos
Objetos y Clases en Java ELO 329: Diseño y Programación Orientados a Objetos 1 Elementos de Análisis y Diseño orientado a objetos Notación y relaciones entre clases: Las clases son abstracciones para los
Unidad III: Lenguaje de manipulación de datos (DML) 3.1 Inserción, eliminación y modificación de registros
Unidad III: Lenguaje de manipulación de datos (DML) 3.1 Inserción, eliminación y modificación de registros La sentencia INSERT permite agregar nuevas filas de datos a las tablas existentes. Está sentencia
FICHEROS Y BASES DE DATOS (E44) 3º INGENIERÍA EN INFORMÁTICA. Tema 9. Reglas de Integridad
FICHEROS Y BASES DE DATOS (E44) 3º INGENIERÍA EN INFORMÁTICA Tema 9. Reglas de Integridad 1.- Introducción. 2.- Claves Primarias. 3.- Regla de Integridad de Entidades. 4.- Claves Ajenas. 5.- Regla de Integridad
SEPARAR Y ADJUNTAR UNA BASE DE DATOS. Separar una base de datos
SEPARAR Y ADJUNTAR UNA BASE DE DATOS Separar una base de datos Al separar una base de datos la está eliminando de la instancia de SQL Server, pero la deja intacta en sus archivos de datos y en los archivos
INTRODUCCION. entidades. Modelo lógico de la base de datos. Matricula. carne. codigo_curso. año semestre nota. propiedades
INTRODUCCION Uno de los objetivos del curso es modelar a través de un diagrama las estructuras lógicas requeridas para almacenar los datos y resolver las consultas del sistema información que requiera
Manual de Instalación
ASEGURA Estima el requerimiento financiero para el aseguramiento Manual de Instalación Agosto, 2015 La herramienta presentada fue elaborada por el proyecto USAID Políticas en Salud, en estrecha colaboración
LiLa Portal Guía para profesores
Library of Labs Lecturer s Guide LiLa Portal Guía para profesores Se espera que los profesores se encarguen de gestionar el aprendizaje de los alumnos, por lo que su objetivo es seleccionar de la lista
EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso 2010 2011. Cuatrimestre de otoño. 17 de Enero de 2011
EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso 2010 2011. Cuatrimestre de otoño. 17 de Enero de 2011 1. (0,75 PUNTOS) Identificad a continuación las sentencias que son ciertas, descartando
1. Creación del repositorio
FACULTADE DE INFORMÁTICA Departamento de Computación Tecnología de la Programación 2008-2009 Ingeniería Informática Práctica 1: Subversion Introducción El objetivo de esta práctica es aprender a manejar
Introducción a la Firma Electrónica en MIDAS
Introducción a la Firma Electrónica en MIDAS Firma Digital Introducción. El Módulo para la Integración de Documentos y Acceso a los Sistemas(MIDAS) emplea la firma digital como método de aseguramiento
CREACIÓN DE WEBSERVICES
CREACIÓN DE WEBSERVICES Versión 1.1 MARZO 2007 Página: 1 1 TABLA DE CONTENIDO 1 TABLA DE CONTENIDO... 2 2 INTRODUCCIÓN... 3 3 HERRAMIENTA DE DESARROLLO ANT... 3 4 CREACION SERVICIO WEB... 3 5 CREACIÓN
http://www.oracle.com/technetwork/es/java/javase/downloads/index.html
Introducción En esta primera parte del taller iremos viendo paso a paso como poner a punto todo tu entorno de trabajo para poder empezar cuanto antes a desarrollar tu primera aplicación Android para luego
Universidad ORT - Arquitectura de Software. Requisitos
Requisitos Versión 1.5 (o superior) de la JDK de Java NetBeans 6.5 como IDE de desarrollo JBoss 4.2.x como Application Server Variable de entorno de Windows JAVA_HOME apuntando al directorio de instalación
GUÍA PARA LA CONFIGURACIÓN Y UTILIZACIÓN DE LA IDE DRJAVA
Universidad Católica del Norte Facultad de Ingeniería y Ciencias Geológicas Departamento de Ingeniería de Sistemas y Computación GUÍA PARA LA CONFIGURACIÓN Y UTILIZACIÓN DE LA IDE DRJAVA 1. INTRODUCCIÓN
A continuación se describen cuáles son los elementos principales de las tablas, cómo crear una y cómo modificarla.
4. TABLAS A continuación se describen cuáles son los elementos principales de las tablas, cómo crear una y cómo modificarla. 4.1. Principales Elementos Al momento de generar y diseñar una tabla es importante
Descarga, instalación y uso de herramientas:
Descarga, instalación y uso de herramientas: Eclipse: Instalación de Eclipse (Más información en http://www.eclipse.org/) 1. Copiar, descomprimir e instalar si es necesario la última versión de Eclipse
%& %)& '$!%*+ $, %%%&$ %%
OBJETIVO!!"#$$ %& '(%"#% (% %& %)& '$!%*+ $, %%%&$ %% REQUERIMIENTOS SOFTWARE VERSIÓN LINK Java Development Kit (JDK) 6 http://java.sun.com NetBeans 6.1 http://www.netbeans.org MySQL 5.0 http://dev.mysql.com/
Manual De Instalación MySQl 5.1 MANUAL DE INSTALACIÓN Y CONFIGURACIÓN DE MYSQL 5.1.40
MANUAL DE INSTALACIÓN Y CONFIGURACIÓN DE MYSQL 5.1.40 Página 1 de 15 1.- Ejecutamos el fichero mysql-essential-5.1.40-win32. Espera unos minutos mientras se cargan los archivos necesarios para la instalación
Administración de la producción. Sesión 10: Gestor de Base de Datos (Access)
Administración de la producción Sesión 10: Gestor de Base de Datos (Access) Contextualización Microsoft Access es un sistema de gestión de bases de datos, creado para uso personal y de pequeñas organizaciones,
Introducción a la programación orientada a objetos
Introducción a la programación orientada a objetos 1. Introducción a la programación orientada a objetos 2. Las clases 3. El tipo Struct 4. Diferencias entre Class y Struct 5. Pilares de la Programación
Conceptos básicos Oracle 10g Introducción - Administración de Oracle - Orasite.com
1. Objetivos El objetivo de este artículo es describir brevemente los siguientes conceptos básicos a modo de familiarización con las bases de datos ORACLE. - Describir brevemente en qué consiste el modelo
Manual de Integración CubeCart
Manual de Integración CubeCart Guía de integración de CubeCart con PagosOnline.net VERSIÓN 3.0 Capítulo 1. INTRODUCCIÓN CubeCart es una de las soluciones más populares para el desarrollo de Comercio Electrónico
8. Sentencia return y métodos
92 A. García-Beltrán y J.M. Arranz 8. Sentencia return y métodos Objetivos: a) Describir el funcionamiento de la sentencia return b) Interpretar el resultado de una sentencia return en el código fuente
Descripción del tutorial. Contenidos. www.facebook.com/codigonexogr. @codigonexo. www.plus.google.com/+codigonexogr/
www.facebook.com/codigonexogr @codigonexo www.plus.google.com/+codigonexogr/ Contenidos 1. Introducción al patrón MVC 1.1.Conceptos básicos Qué es un patrón 1.2.Estructura del patrón MVC 1.3.Cómo funciona
El lenguaje de manipulación de datos (DML) es una parte fundamental de SQL.
GUIA DE LABORATORIO # 5 Nombre de la Practica: Manipulación de datos Lugar de ejecución: Centro de Computo MATERIA: Base de Datos II CICLO: 02-2012 I. OBJETIVOS ESPECIFICOS Qué el estudiante: Manipule
CURSO DE SQL SERVER 2005
CURSO DE SQL SERVER 2005 Una vez finalizado el curso, el alumno estará preparado para: Instalar y configurar SQL Server 2005. Comprender los conceptos más importantes del diseño de bases de datos. Crear
Pruebas de unidad con JUnit
Pruebas de unidad con JUnit Cuando se implementa software, resulta recomendable comprobar que el código que hemos escrito funciona correctamente. Para ello, implementamos pruebas que verifican que nuestro
19. Packages o paquetes
Programación orientada a objetos con Java 201 19. Packages o paquetes Objetivos: a) Definir el concepto de paquete b) Interpretar el código fuente de una aplicación Java donde se utilicen paquetes c) Construir
UNIDAD 2: Abstracción del Mundo real Al Paradigma Orientado a Objetos
2.1. Principios básicos del Modelado de Objetos UNIDAD 2: Abstracción del Mundo real Al Paradigma Orientado a Objetos Hoy en día muchos de los procesos que intervienen en un negocio o empresa y que resuelven
Curso de PHP con MySQL Gratis
Curso de PHP con MySQL Gratis Introducción Este mini curso o mini tutorial de PHP le ayudará a realizar cualquier sistema para que pueda insertar uno o varios registros a una base de datos con MySQL, este
MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO
MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO Fecha última revisión: Junio 2011 INDICE DE CONTENIDOS HERRAMIENTA DE APROVISIONAMIENTO... 3 1. QUÉ ES LA HERRAMIENTA DE APROVISIONAMIENTO... 3 HERRAMIENTA
Análisis y diseño del sistema CAPÍTULO 3
Análisis y diseño del sistema CAPÍTULO 3 36 CAPÍTULO 3 Análisis y diseño del sistema En este capítulo se pretende realizar un análisis detallado de los requerimientos del software a desarrollar para la
ADMINISTRACIÓN DE BASE DE DATOS
SQL SERVER T-SQL QUERY s es ADMINISTRADOR GRÁFICO SGBD Elementos objetos Tablas Procedimientos Triggers Funciones Usuarios Permiso Roles Contraseñas Programas DTS (Data Transfer System) Exportación e Importación
Un ejemplo teórico de trigger podría ser éste:
9. TRIGGERS EN LA BASE DE DATOS Un trigger (disparador sería la traducción técnica) es un bloque PLSQL que se ejecuta implícitamente cuando ocurre un evento y pueden ser de base de datos o de aplicación.
DDBUILDER MANUAL DEL USUARIO
DDBUILDER MANUAL DEL USUARIO Página Qué es DDBuilder? 102 Creando Un Nuevo Diccionario de Datos 103 El Archivo de Configuración CONFIG.TPM 103 El archivo SQL.INI 104 La Interface de DDBuilder 105 Barra
Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java
Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java Identificadores Las variables se utilizan en programación para almacenar temporalmente
Toda base de datos relacional se basa en dos objetos
1. INTRODUCCIÓN Toda base de datos relacional se basa en dos objetos fundamentales: las tablas y las relaciones. Sin embargo, en SQL Server, una base de datos puede contener otros objetos también importantes.
CONSULTAS CON SQL. 3. Hacer clic sobre el botón Nuevo de la ventana de la base de datos. Aparecerá el siguiente cuadro de diálogo.
CONSULTAS CON SQL 1. Qué es SQL? Debido a la diversidad de lenguajes y de bases de datos existentes, la manera de comunicar entre unos y otras sería realmente complicada a gestionar de no ser por la existencia
