Hibernate - JPA @luce

967 views

Published on

Introduction to Hibernate/JPA, starting with @OneToMany mappings.

1/5

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
967
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
35
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Hibernate - JPA @luce

  1. 1. Hibernate / JPA @luce
  2. 2. ¿Cómo nos vamos a organizar?
  3. 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. 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. 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!
  6. 6. Referencias
  7. 7. Referencias * • Java Persistence with Hibernate de Gavin King (2º ed en marcha) • Referencias oficiales • Referencia oficial de 3.6 en español
  8. 8. Sesión 1
  9. 9. ¿Por qué Hibernate/JPA?
  10. 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. 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. 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
  13. 13. ¿Qué deberíamos saber? • Java. • Conocimientos básicos de desarrollo web con un servidor de aplicaciones. • Algo de SQL
  14. 14. ¿Qué es Hibernate/JPA?
  15. 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. 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. 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. 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. 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. 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. 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. 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. 23. ¿Qué es Hibernate/JPA? -> Ejemplo • • • HelloDatabaseJPATest HelloDatabaseJPAWithHibernateTest Diferencias: o Sintaxis diferente o Persistence.xml (META-INF)
  24. 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. 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. 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)
  27. 27. Persistencia de entidades simples.
  28. 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. 29. Persistencia de entidades simples • Sabiendo esto... o Conseguir que funcione el test ListUsersTest o [AVANZADO] Diferencias entre session.load y session.get?
  30. 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. 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. 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. 33. Mapeos básicos * • Otra propiedad muy importante es: o @Transient. o Para qué puede servir?  ... • Probadlo!
  34. 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. 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. 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. 37. Persistencia de entidades simples • Ya que estamos... • Actualizad una entidad usuario • [Avanzado] probad las diferentes formas de guardar
  38. 38. Persistencia de entidades simples • Y completando el CRUD... eliminad un usuario
  39. 39. Relaciones simples.
  40. 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.
  41. 41. Relaciones simples • Crear una entidad Rol (id, nombre...) • Guarda un Rol • Pruebalo!
  42. 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. 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. 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
  45. 45. Más relaciones (para la próxima sesión) • • • • • • • • • @OneToOne @OneToMany @ManyToMany ... Propietario? Relaciones bidireccionales? Mapas? Tablas intermedias? Orden?
  46. 46. Glosario
  47. 47. Glosario • ...
  48. 48. FAQs
  49. 49. FAQs • ...
  50. 50. Hibernate / JPA @luce

×