Post on 13-Jun-2015
description
Hibernate / JPA @luce
¿Cómo nos vamos a organizar?
¿Cómo?
• Introduciendo (un poco) teoría y realizando pequeños ejercicios/dinámicas basadas en la teoría.
• Intentaré que estén disponibles en red todos los ejercicios. Plantearé retos adicionales si terminais rápidamente.
• Podemos hacer dinámicamente un glosario de términos y preguntas al final de las diapositivas.
• Hablo muy rápido y presupongo cosas. Interrumpidme! Preguntad dudas!
Presentación (para youtube)*
• Javier Gamarra (javier.gamarra@luceit.com / @nhpatt / http://nhpatt.com/)
• Desarrollador en Luce I.T., una empresa dedicada a desarrollo Java principalmente.
• Llevo utilizando Hibernate desde hace 5 años.
¿Cómo?, de nuevo
• El objetivo principal del curso es APRENDER.
• Para aprender hay que estar interesado e involucrarse.
• No muerdo.
• Acepto críticas sobre la forma y el fondo! Feedback!
Referencias
Referencias *
• Java Persistence with Hibernate de Gavin King (2º ed en marcha)
• Referencias oficiales
• Referencia oficial de 3.6 en español
Sesión 1
¿Por qué Hibernate/JPA?
¿Por qué? *
• Tradicionalmente…o … se escribía el SQL a mano de las operacioneso … con una query diferente para cada pantallao … con una query específica para cada modificacióno … y había que ajustar todas cuando algo cambiaba
• Con suerte…o … generabas las consultas automáticamente y cruzabas los dedos para
que el modelo de datos no cambiase demasiado
¿Por qué?
• Acceso directo mediante SQL
• O con un patrón:o Capa de acceso a datos (DAO, OAD…)
Una clase por cada tabla, que conoce su estructura Habitualmente, con objetos de transferencia (DTO, OT…)
¿Por qué?
• Pero hay más formas (y mejores!):o Mapeo O/R
Capa que “traduce” entre tablas y objetos Gestor externo a ellas
o ActiveRecord Un objeto ← una (fila en una) tabla Las operaciones están en el propio objeto
¿Qué deberíamos saber?
• Java.
• Conocimientos básicos de desarrollo web con un servidor de aplicaciones.
• Algo de SQL
¿Qué es Hibernate/JPA?
¿Qué es Hibernate/JPA? -> Ejemplo *
• Base de datos H2o BD en JAVA (más fácil de montar que Oracle XE).
o Instalad h2-setup-2013-03-17! (en la carpeta hibernate)
o Y lanzad h2.bat (en C:\Program Files (x86)|Archivos de programa\H2\bin)
o Consola local en localhost:8082, Conectar. (como Toad)• Probadlo!• Hay un script de prueba, insertadlo.
¿Qué es Hibernate/JPA? -> Ejemplo
• Abrid Eclipse y lanzad el test HelloDatabaseHibernateAnotationsTesto Run as JUnit Test
• Qué hace?o Una consulta a la base de datos
¿Qué es Hibernate/JPA? -> Ejemplo
• SessionFactoryo Factoría de sesiones, thread safe, único en la aplicación.
• Sessiono Comunicación con la BD, not-thread-safe, mono-hilo, operación con la
base de datos.• Propiedades de Hibernate
o hibernate.cfg.xml/persistence.xml -> configuración de la BD.• Anotaciones
o Cruce entre los objetos (entidades) y la base de datos (tablas).
¿Qué es Hibernate/JPA? -> ORM *
• Object Relational Mapper/Mapping
• Tecnología que intenta solucionar el problema de comunicación entre las bases de datos (relacionales) y los modelos Java (objetos).
• Este problema se denomina 'object/relational paradigm mismatch'.o Herencia, composición, polimorfismo?
¿Qué es Hibernate/JPA? -> ORM
• Un ORM hace de 'puente' entre tablas y objetos, en base a hints, 'mapeos'.
• Normalmente es más cosas:o Un API para hacer operaciones CRUDo Un lenguaje de consultaso Una forma de establecer metadatos de 'mapeos'o Técnicas de cacheo, optimización...
¿Qué es Hibernate/JPA? -> ORM
• ¿Por qué?
o Productividad -> soy más rápido escribiendo código
o Mantenibilidad -> más fácil añadir columnas
o Rendimiento -> no siempre escribo consultas 100% perfectas
o Independencia -> puedo cambiar de BD más fácilmente
¿Qué es Hibernate/JPA? -> Hibernate
• ORM Open Source Java, LGPLo Implementación de JPA, parte de EJB3.0, JEE 5o @author: Gavin King 2001o 2003 - Hibernate 2o 2013 4Q - Hibernate 5
• Contratación (no compra) por parte de Jboss• Mapeo mediante XML o anotaciones• Mapeo en atributos o propiedades
¿Qué es Hibernate/JPA? -> Hibernate *
• XML o anotaciones• Lanzad HelloDatabaseHibernateXMLTest
o Véis diferencias?o Eliminad las anotaciones de Test.java y probad.o addClass/addAnotatedClass
• Propiedades o atributoso Quitad la anotación de @Id y pasadla al atributo (encima de private
Integer id)
¿Qué es Hibernate/JPA? -> Ejemplo
• HelloDatabaseJPATest• HelloDatabaseJPAWithHibernateTest
• Diferencias:o Sintaxis diferenteo Persistence.xml (META-INF)
¿Qué es Hibernate/JPA? -> JPA
• Java Persistence API (2006)
• Una especificación oficial Java (JSR 220 y JSR 317)
• Actualmente la versión 2.1 (2013)
• Hibernate es una implementación de JPA (una de muchas)
¿Qué es Hibernate/JPA?
• Librerías:o hibernate-core es el núcleo de Hibernateo hibernate-commons-annotations el soporte a anotacioneso hibernate-entitymanager y jpa dan soporte a jpa, la segunda es opcional.
¿Cuál es la opción recomendada?
• Yo personalmente, prefiero JPA con Hibernate (último ejemplo)o Quiero anotacioneso Me gusta más la sintaxis de sessiono No quiero definir mapeos y marcar bien cuando uso algo de Hibernate...
• No os preocupéis por el código de configuración, lo hace todo el servidor
• Es muy muy raro cambiar de proveedor de JPA (menos raro cambiar de BD)
Persistencia de entidades simples.
Persistencia de entidades simples
• Una entidad de Hibernate con anotaciones es sólo:
o La clase anotada como @Entity
o Un campo anotado con @Id
o Un constructor sin argumentos (opcional, si hay algún constructor)
o Implementando Serializable (opcional, por CDI)
Persistencia de entidades simples
• Sabiendo esto...
o Conseguir que funcione el test ListUsersTest
o [AVANZADO] Diferencias entre session.load y session.get?
Mapeos básicos *
• Hay anotaciones indispensables:
o @Table
o @Column
• Sirven para especificar atributos de las tablas y las columnas...
• Uno de los más típicos es el nombre (name), probadlo!
Mapeos básicos
• Probad a añadir una columna/campo más... con una restricción (nullable, unique...)o Se añade automáticamente por la configuración de hibernate.o Junto con las restricciones...
Enfoques de desarrollo
• Top-down: modelos primero -> típicamente, generación automática de tablas con hibernate.hbm2ddl.autoo createo create-dropo updateo validate (default)
• Bottom-up: tablas primero -> típicamente, generación automática de modelos con Eclipse
Mapeos básicos *
• Otra propiedad muy importante es:o @Transient.
o Para qué puede servir? ...
• Probadlo!
Persistencia de entidades simples
• Transacciones, triviales:o Transaction tx = session.beginTransaction();
o tx.commit();
• Soporta físicamente:o JDBCo JTAo CMTo Personalizadas...
Persistencia de entidades simples
• Sabiendo cómo se comienza una transacción...• Y conociendo session.save()...
• Guardad un nuevo usuarioo Transaction transaction = session.getTransaction()o transaction.begin()o session.save(new Usuario(ID;NOMBRE));o transaction.commit();
• Avanzado - save(), persist(), diferencias?o Pista: tienen que ver con las transacciones...
Persistencia de entidades simples
• Si tenéis problemas con los ids:o Anotad el id con @GeneratedValue(strategy =
GenerationType.SEQUENCE)o Luego volveremos sobre esto...
Persistencia de entidades simples
• Ya que estamos...
• Actualizad una entidad usuario
• [Avanzado] probad las diferentes formas de guardar
Persistencia de entidades simples
• Y completando el CRUD... eliminad un usuario
Relaciones simples.
Relaciones simples
• En E-R, una relación entre tablas típica es una relación many-to-one.
• En nuestro ejemplo, un usuario tiene un rol dentro de la aplicación.
• En Hibernate es una relación many-to-one y se mapea con su anotación específica.
Relaciones simples
• Crear una entidad Rol (id, nombre...)
• Guarda un Rol
• Pruebalo!
Relaciones simples
• Queremos modelar que un usuario puede tener un rol en un momento dado.
• Para ello, definimos una entidad Rol dentro de usuario, con su getter y setter.
• La anotamos con la propiedad @ManyToOne.
• Y ya está, pruebalo! de momento guarda un rol y su usuario con su rol. Recupera de BD la entidad usuario y mira a ver si conserva el rol...
Relaciones simples
• Busca un rol de BD
• Añade una atributo Rol en User (con @ManyToOne)
• Guarda un rol en el User (usuario.setRol(rolBuscadoDeBaseDeDatos))
• Recupera el User con un get (debería tener su rol asociado).
Recapitulando...
• Mediante ORMs automatizamos esto:o Clase ←→ Tablao Propiedad ←→ Columnao Referencia a un objeto ←→ Relación 1-1 o *-1 con FKo Colección de objetos ←→ Relación 1-* o *-* con join table
• Las consultas (inserts, updates, deletes, DDL) se calculan dinámicamente• object-relational impedance mismatch
Más relaciones (para la próxima sesión)
• @OneToOne• @OneToMany• @ManyToMany• ...• Propietario?• Relaciones bidireccionales?• Mapas?• Tablas intermedias?• Orden?
Glosario
Glosario
• ...
FAQs
FAQs
• ...
Hibernate / JPA @luce