50
Hibernate / JPA @luce

Hibernate - JPA @luce

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Hibernate - JPA @luce

Hibernate / JPA @luce

Page 2: Hibernate - JPA @luce

¿Cómo nos vamos a organizar?

Page 3: Hibernate - JPA @luce

¿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!

Page 4: Hibernate - JPA @luce

Presentación (para youtube)*

• Javier Gamarra ([email protected] / @nhpatt / http://nhpatt.com/)

• Desarrollador en Luce I.T., una empresa dedicada a desarrollo Java principalmente.

• Llevo utilizando Hibernate desde hace 5 años.

Page 5: Hibernate - JPA @luce

¿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!

Page 6: Hibernate - JPA @luce

Referencias

Page 7: Hibernate - JPA @luce

Referencias *

• Java Persistence with Hibernate de Gavin King (2º ed en marcha)

• Referencias oficiales

• Referencia oficial de 3.6 en español

Page 8: Hibernate - JPA @luce

Sesión 1

Page 9: Hibernate - JPA @luce

¿Por qué Hibernate/JPA?

Page 10: Hibernate - JPA @luce

¿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

Page 11: Hibernate - JPA @luce

¿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…)

Page 12: Hibernate - JPA @luce

¿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

Page 13: Hibernate - JPA @luce

¿Qué deberíamos saber?

• Java.

• Conocimientos básicos de desarrollo web con un servidor de aplicaciones.

• Algo de SQL

Page 14: Hibernate - JPA @luce

¿Qué es Hibernate/JPA?

Page 15: Hibernate - JPA @luce

¿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.

Page 16: Hibernate - JPA @luce

¿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

Page 17: Hibernate - JPA @luce

¿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).

Page 18: Hibernate - JPA @luce

¿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?

Page 19: Hibernate - JPA @luce

¿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...

Page 20: Hibernate - JPA @luce

¿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

Page 21: Hibernate - JPA @luce

¿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

Page 22: Hibernate - JPA @luce

¿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)

Page 23: Hibernate - JPA @luce

¿Qué es Hibernate/JPA? -> Ejemplo

• HelloDatabaseJPATest• HelloDatabaseJPAWithHibernateTest

• Diferencias:o Sintaxis diferenteo Persistence.xml (META-INF)

Page 24: Hibernate - JPA @luce

¿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)

Page 25: Hibernate - JPA @luce

¿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.

Page 26: Hibernate - JPA @luce

¿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)

Page 27: Hibernate - JPA @luce

Persistencia de entidades simples.

Page 28: Hibernate - JPA @luce

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)

Page 29: Hibernate - JPA @luce

Persistencia de entidades simples

• Sabiendo esto...

o Conseguir que funcione el test ListUsersTest

o [AVANZADO] Diferencias entre session.load y session.get?

Page 30: Hibernate - JPA @luce

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!

Page 31: Hibernate - JPA @luce

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...

Page 32: Hibernate - JPA @luce

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

Page 33: Hibernate - JPA @luce

Mapeos básicos *

• Otra propiedad muy importante es:o @Transient.

o Para qué puede servir? ...

• Probadlo!

Page 34: Hibernate - JPA @luce

Persistencia de entidades simples

• Transacciones, triviales:o Transaction tx = session.beginTransaction();

o tx.commit();

• Soporta físicamente:o JDBCo JTAo CMTo Personalizadas...

Page 35: Hibernate - JPA @luce

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...

Page 36: Hibernate - JPA @luce

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...

Page 37: Hibernate - JPA @luce

Persistencia de entidades simples

• Ya que estamos...

• Actualizad una entidad usuario

• [Avanzado] probad las diferentes formas de guardar

Page 38: Hibernate - JPA @luce

Persistencia de entidades simples

• Y completando el CRUD... eliminad un usuario

Page 39: Hibernate - JPA @luce

Relaciones simples.

Page 40: Hibernate - JPA @luce

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.

Page 41: Hibernate - JPA @luce

Relaciones simples

• Crear una entidad Rol (id, nombre...)

• Guarda un Rol

• Pruebalo!

Page 42: Hibernate - JPA @luce

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...

Page 43: Hibernate - JPA @luce

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).

Page 44: Hibernate - JPA @luce

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

Page 45: Hibernate - JPA @luce

Más relaciones (para la próxima sesión)

• @OneToOne• @OneToMany• @ManyToMany• ...• Propietario?• Relaciones bidireccionales?• Mapas?• Tablas intermedias?• Orden?

Page 46: Hibernate - JPA @luce

Glosario

Page 47: Hibernate - JPA @luce

Glosario

• ...

Page 48: Hibernate - JPA @luce

FAQs

Page 49: Hibernate - JPA @luce

FAQs

• ...

Page 50: Hibernate - JPA @luce

Hibernate / JPA @luce