3. ¿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!
4. 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.
5. ¿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!
10. ¿Por qué? *
•
•
Tradicionalmente…
o … se escribía el SQL a mano de las operaciones
o … con una query diferente para cada pantalla
o … con una query específica para cada modificación
o … 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
11. ¿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…)
12. ¿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
15. ¿Qué es Hibernate/JPA? -> Ejemplo *
•
Base de datos H2
o 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 programaH2bin)
•
•
o Consola local en localhost:8082, Conectar. (como Toad)
Probadlo!
Hay un script de prueba, insertadlo.
16. ¿Qué es Hibernate/JPA? -> Ejemplo
•
•
Abrid Eclipse y lanzad el test HelloDatabaseHibernateAnotationsTest
o Run as JUnit Test
Qué hace?
o Una consulta a la base de datos
17. ¿Qué es Hibernate/JPA? -> Ejemplo
•
•
•
•
SessionFactory
o Factoría de sesiones, thread safe, único en la aplicación.
Session
o 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).
18. ¿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?
19. ¿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 CRUD
o Un lenguaje de consultas
o Una forma de establecer metadatos de 'mapeos'
o Técnicas de cacheo, optimización...
20. ¿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
21. ¿Qué es Hibernate/JPA? -> Hibernate
•
•
•
•
ORM Open Source Java, LGPL
o Implementación de JPA, parte de EJB3.0, JEE 5
o @author: Gavin King 2001
o 2003 - Hibernate 2
o 2013 4Q - Hibernate 5
Contratación (no compra) por parte de Jboss
Mapeo mediante XML o anotaciones
Mapeo en atributos o propiedades
22. ¿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 atributos
o Quitad la anotación de @Id y pasadla al atributo (encima de private
Integer id)
23. ¿Qué es Hibernate/JPA? -> Ejemplo
•
•
•
HelloDatabaseJPATest
HelloDatabaseJPAWithHibernateTest
Diferencias:
o Sintaxis diferente
o Persistence.xml (META-INF)
24. ¿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)
25. ¿Qué es Hibernate/JPA?
•
Librerías:
o hibernate-core es el núcleo de Hibernate
o hibernate-commons-annotations el soporte a anotaciones
o hibernate-entitymanager y jpa dan soporte a jpa, la segunda es opcional.
26. ¿Cuál es la opción recomendada?
•
Yo personalmente, prefiero JPA con Hibernate (último ejemplo)
o Quiero anotaciones
o Me gusta más la sintaxis de session
o 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)
28. 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)
29. Persistencia de entidades simples
•
Sabiendo esto...
o Conseguir que funcione el test ListUsersTest
o [AVANZADO] Diferencias entre session.load y session.get?
30. 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!
31. 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...
32. Enfoques de desarrollo
•
•
Top-down: modelos primero -> típicamente, generación automática de tablas
con hibernate.hbm2ddl.auto
o create
o create-drop
o update
o validate (default)
Bottom-up: tablas primero -> típicamente, generación automática de
modelos con Eclipse
33. Mapeos básicos *
•
Otra propiedad muy importante es:
o @Transient.
o Para qué puede servir?
...
•
Probadlo!
34. Persistencia de entidades simples
•
•
Transacciones, triviales:
o Transaction tx = session.beginTransaction();
o tx.commit();
Soporta físicamente:
o JDBC
o JTA
o CMT
o Personalizadas...
35. Persistencia de entidades simples
•
•
•
•
Sabiendo cómo se comienza una transacción...
Y conociendo session.save()...
Guardad un nuevo usuario
o 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...
36. 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...
37. Persistencia de entidades simples
•
Ya que estamos...
•
Actualizad una entidad usuario
•
[Avanzado] probad las diferentes formas de guardar
40. 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.
42. 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...
43. 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).
44. Recapitulando...
•
•
•
Mediante ORMs automatizamos esto:
o Clase ←→ Tabla
o Propiedad ←→ Columna
o Referencia a un objeto ←→ Relación 1-1 o *-1 con FK
o 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