35
pablomonteserin.com Hibernate Disminuye la cantidad de código usado. Simplifica la interacción con la base de datos. Optimiza el acceso a la base de datos.

Hibernate

Embed Size (px)

DESCRIPTION

Hibernate para principiantes

Citation preview

  • pablomonteserin.com

    Hibernate

    Disminuye la cantidad de cdigo usado.

    Simplifica la interaccin con la base de datos.

    Optimiza el acceso a la base de datos.

  • pablomonteserin.com

    ORM

    Object Relational Mapping. Se encarga de transformar las tablas en clases, filas en registros y viceversa.

  • pablomonteserin.com

    Clave primaria

    Usando Hibernate:- es fundamental que las tablas tengan clave primaria.- no es posible modificar claves primarias.

  • pablomonteserin.com

    Usaremos el plugin para eclipse:Hibernate Tools

    Help -> Install new software -> (ojo!!!! no introducir esta url en elwork with) add -> pegamos ->http://download.jboss.org/jbosstools/updates/stable/

    - Marcamos, dentro de All Jboss Tools:Hibernate Tools

  • pablomonteserin.com

    Descargar las libreras de hibernate

    http://hibernate.org/downloads

    Enlace final:http://sourceforge.net/projects/hibernate/files/hibernate3/pablomonteserin.com

  • pablomonteserin.com

    Jar que hay que aadir

    Add External jar aade la ruta absoluta:

    hibernate-distribution-3.6.0.Final/Hibernate3.jarhibernate-distribution-3.6.0.Final/lib/jpa/*hibernate-distribution-3.6.0.Final/lib/required/*Mysqlconnector

    En total hay que aadir 9 jars.

  • pablomonteserin.com

    Hibernate.cfg.xmlLo ms cmodo es copiarlo de otro proyecto, envez de generarlo nosotros.Debe estar en la raz de la carpeta src.

    falsecom.mysql.jdbc.Driver2password10jdbc:mysql://localhost/pruebasrootmanagedorg.hibernate.dialect.MySQLDialecttrue

  • pablomonteserin.com

    Nomenclatura de tablas cuando trabajemos con Hibernate

    Las palabras del nombre de la tabla se separancon guin bajo. Luego hibernate cambiar dicho _por la siguiente letra en mayscula.

    Ya que las tablas se convertirn en clases, seescriben en singular.

  • pablomonteserin.com

    Nomenclatura de tablas cuando trabajemos con Hibernate

    Las palabras del nombre de la tabla se separancon guin bajo. Luego hibernate cambiar dicho _por la siguiente letra en mayscula.

    Ya que las tablas se convertirn en clases, seescriben en singular.

  • pablomonteserin.com

    Definir claves forneas en mysql con phpmyadmin

    Selecciono la tabla con la clave fornea -> Structure -> Indexes -> go ->Index name: fk_tablaConClaveForanea_tablaActualIndex type: indexField: campo que ser clave fornea en esta tabla.

    Entramos en relationView de la tabla que contiene la clave foranea pararelacionarla con la tabla que contiene la clave primaria.Vamos a la combo del campo que ser clave fornea y seleccionamos la clavePrimaria de la propia tabla.En la combo contigua seleccionamos la clave primaria de la tabla con la que estamos enlazando

    Ojo!Ojo!Los camposrelacionados debencontener informacindel mismo tipo.

  • pablomonteserin.com

    Claves forneas en hibernate

    Hibernate reconoce una clave fornea en la basede datos y crea en la Clase generada un mtodoget para recuperar informacin de la tablavinculada.

  • pablomonteserin.com

    Configuracin de consola

    Btn derecho sobre el paquete -> run as -> Run configurations -> HibernateConsole Configuration -> new configuration

    Pestaa MainPestaa MainProyect: nombre del proyecto.Configuration file: setup y busco el archivo hibernate.cfg.xml deConfiguracin.

    Pestaa ClassPath:Pestaa ClassPath:Me aseguro de que estn cargadas las 9 libreras indicadas en ladiapositiva anterior.

  • pablomonteserin.com

    Problema con el classpathSi despus de crear la configuracin de consola aado nuevas librerias al proyecto, estas no sern reconocidas por el classpath de configuracin de consola, y al ejecutar la generacin automtica de clases de hibernate obtendremos el siguiente error.

  • pablomonteserin.com

    Problema al marcar los exporters

  • pablomonteserin.com

    Hibernate Code Generation Configurations

    Hay que estar en perspectiva Java.Icono con desplegable de Hibernate -> Hibernate Code Generation Configurations

    Pestaa Main:Pestaa Main:Console configuration: Selecciono la configuracin de consola previamentecreada.Output directory -> NombreDelProyecto/src.Reverse engineer from JDBC Connection -> Marco la checkPackage: com.pablomonteserin.model

    Pestaa Exporters:Pestaa Exporters:Marco las checks Domain code, Hibernate XML Mappings, Hibernate XMLConfiguration.

    RunRunEsto crea una clase por cada tabla de mi base de datos, as como un get y set por cadacolumna.

  • pablomonteserin.com

    Mapeos de Hibernate

    Las tablas de hibernate son mapeadas a ficheros *.hbm.xml. Si el archivohibernate.cfg.xml tiene una referencia a dichos mapeos y no los encuentrafsicamente en el equipo, dar un error.

  • pablomonteserin.com

    Ejercicio crear base de datos

  • pablomonteserin.com

    De JDBC a Hibernate

    Cambiamos la clase ConnectionProvider por SessionProvider. Por tanto, en vezde obtener una conexin, obtenemos una sesin.

  • pablomonteserin.com

    Hibernate API

    http://docs.jboss.org/hibernate/core/3.5/javadocs/

  • pablomonteserin.com

    Objeto Session FactoryControla las sesiones. Hay que crearlo una vez sola en toda la aplicacin.

    Habr un sesin factory por cada base de datos.

    Cada vez que necesito base de datos, se la pido a la sesin.

    En una aplicacin web el sessionFactory estara el contexto, y lo declaro una sola vezpara toda la aplicacin.

    Sin embargo, el transaction y el session son declarados a nivel de mtodo.

  • pablomonteserin.com

    Recuperacin de la session para no tener que instanciar un SessionFactory cada vez que la necesite.

    public class ConexionProviderSingleton {SessionFactory sessionFactory;static private ConexionProviderSingleton _instance = null;

    protected ConexionProviderSingleton() {sessionFactory = new Configuration().configure().buildSessionFactory();

    }

    public Session getSession(){return sessionFactory.openSession();

    }

    static public ConexionProviderSingleton instance() {if (null == _instance) {

    _instance = new ConexionProviderSingleton();}return _instance;

    }}

    Para recuperar la sesin desde la clase servicio:Session session = ConexionProviderSingleton.instance().getSession();

  • pablomonteserin.com

    Ejemplo

  • pablomonteserin.com

    Transacciones

    Cada request que llega del servidor debe ser atendido por unasola transaccin.

    En caso de fallo, lo que hay dentro del beginTransaction y elcommit no se ejecuta y se salta a un catch.

    Siempre es ms rpido hacer dos operaciones en una solatransaccin que dos operaciones en dos transacciones.pablomonteserin.com

  • pablomonteserin.com

    Mtodos de la clase Session

    session.save() -> guarda un objeto como registroen la base de datos.

    session.update() -> modifica un objeto comoregistro en la base de datos.

    session.get(Persona.class, id) -> me permite recuperar datos.

    Session.delete(...) Mejor hacerlo con HQL.

  • pablomonteserin.com

    session.get(Object.class, primary key)

  • pablomonteserin.com

    Ejercicio

    1 Insertar cuatro registros.

    2 - Insertar cuatro registros en la base de datos eimprimir los libros del autor cuya clave primaria esTres.

    3 Modificar uno de los registros insertados.

  • pablomonteserin.com

    Ejercicio

    Insertar un autor de un libro y ese mismo libro

  • pablomonteserin.com

    Mtodos de la clase Criteria

    Consultar una tablaConsultar una tablaCriteria crit = session.createCriteria(Autor.class);List result = crit.list();

    Consultar toda la base de datosConsultar toda la base de datosCriteria crit = session.createCriteria(java.lang.Object.class)

    Ordenar el resultado de la consultaOrdenar el resultado de la consultacrit.addOrder(Order.desc(''nombre''));

    Aadir restriccionesAadir restriccionesCrit.add(Restrictions.ilike(''nombre'',''%ar%''));Crit.add(Restrictions.eq(''nombre'', ''Juan''));

  • pablomonteserin.com

    Ejercicio

    Insertar 5 libros en la base de datos. Dos registros deben tener el mismo ttulo (titulo1);

    Utilizar la clase criteria para mostrar los libros cuyo ttulo contenga la palabra ''titulo''.

    Ordenar la salida por id, e ir recorriendala imprimiendo los ttulos y las id con System.out.println();

  • pablomonteserin.com

    Consulta con ExampleConsulta con Example

    Creamos un objeto (s) y buscar a partir de l.Si le pasamos null como parmetro el parmetroes ignorado.

  • pablomonteserin.com

    Trabajo con HQL

  • pablomonteserin.com

    Eliminar un registroEliminar un registroString queryString = "delete from Paciente where id=?";Query hqlQuery = session.createQuery(queryString);hqlQuery.setInteger(0, id);hqlQuery.executeUpdate();

    Consulta simpleConsulta simpleQuery hqlQuery = session.createQuery(''from libro'');List result = hqlQuery.list();

    Consulta ordenadaConsulta ordenadaQuery hqlQuery = session.createQuery(''from libro order by id'');List result = hqlQuery.list();

    Consulta con parmetroConsulta con parmetroString queryString = from Libro where nombre like ?;Query hqlQuery = session.createQuery(queryString).setString(0, %Ro%);

    Consulta con parmetro IIConsulta con parmetro IIString queryString =from Hombre where nombre like: textSearch;Query hqlQuery = session.createQuery(queryString).setString(''textSearch'', %o%);Consulta en el hbm

    Consulta definida en un mapeo hbm.xmlConsulta definida en un mapeo hbm.xml/*La siguiente consulta es recuperada del archivo Simple.hbm.xml. De todas formas, funcionara desde cualquier otro mapeo.En este caso, el cdigo presente en el mapeo es:

    from Libro l where l.titulo like :textoBusqueda]]>

    */Query hqlQuery = session.getNamedQuery("findLibroByTitulo").setParameter("textoBusqueda", "%a%");List result = hqlQuery.list();

  • pablomonteserin.com

    Consulta relacionadaConsulta relacionadaString queryString = ''select l from libro l join l.autor a where a.nombre='nombre1' '';Query hqlQuery = session.createQuery(queryString);

    Consulta relacionada con coincidenciaConsulta relacionada con coincidenciaString queryString = '' from Libro l where l.autor.nombre like :textSearch'';Query hqlQuery = session.createQuery(queryString).setString(''textSearch'', ''%n%'');

    Consulta sumConsulta sumString queryString = ''select sum(l.id) from libro l '';Query hqlQuery = session.createQuery(queryString);

    Aqu relaciono la tabla libro con la tabla autor

    Consulta relacionada

  • pablomonteserin.com

    Evitar inyeccin SQL

    Se debe evitar crear consultas HQL concatenando Strings:Se debe evitar crear consultas HQL concatenando Strings:String queryString ="from item i where i descriptionlike ' " + search + " ' ";

    En cambio es aconsejable usar:En cambio es aconsejable usar:Parmetros con nombre:Parmetros con nombre:String queryString = "from Simple where texto like :textSearch";

    Parmetros posicionales:String queryString = "from Simple whete texto like ?";Query hqlQuery = session.createQuery(queryString).setString(0, %1% );

  • pablomonteserin.com

    EjercicioRealizar las siguientes consultas:- Listar las matrculas de todos los vehculos.

    - Listar la matrcula y el tipo de todos los vehculos ordenados pornmero de ruedas.

    - Listar la matrcula de todos los vehculos que tenganms de dos asientos y ms de dos ruedas.

    - Listar la matrcula de todos los vehculos que tenganms de dos asientos o ms de dos ruedas.

    - Listar la matriula de todos los vehculos que tengan unamatriula de menos de seis caracteres.

    - Listar la matrcula de todos los vehculos que hayantenido un siniestro con valorPerdida mayor de 1000 euros.

    Relacin 1-n (1 vehculo puede tener varios siniestros pero un siniestro slo puede tener un vehculo)

    No es un proyecto web

    Slide 1Slide 2Slide 3Slide 4Slide 5Slide 6Slide 7Slide 8Slide 9Slide 10Slide 11Slide 12Slide 13Slide 14Slide 15Slide 16Slide 17Slide 18Slide 19Slide 20Slide 21Slide 22Slide 23Slide 24Slide 25Slide 26Slide 27Slide 28Slide 29Slide 30Slide 31Slide 32Slide 33Slide 34Slide 35