Your SlideShare is downloading. ×
0
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
T3 - JPA
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

T3 - JPA

1,753

Published on

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

  • Be the first to like this

No Downloads
Views
Total Views
1,753
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
94
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Java Persistence API Daniel Pecos Martínez [email_address] Curso JDBC Marzo 2011
  • 2. 1. Frameworks de Persistencia <ul><ul><li>Un framework de persistencia es una API que permite almacenar datos </li></ul></ul><ul><ul><ul><li>Los soporte de almacenamiento son variados, desde ficheros a bases de datos  </li></ul></ul></ul><ul><ul><li>En Java se han utilizado diversos frameworks de persistencia: </li></ul></ul><ul><ul><ul><li>JDBC </li></ul></ul></ul><ul><ul><ul><li>Enterprise Java Beans : el estándar EJB 2.0 define un tipo de bean llamado Entity Bean , el cual puede ser persistido por el servidor de aplicaciones. Se definió EJBQ QL como lenguaje neutro de acceso a datos. Muy complejo de configurar </li></ul></ul></ul><ul><ul><ul><li>Java Data Objects : mucho más simple a EJB 2.0 y surge como alternativa a éste, aunque nunca llegó a formar parte del éstandar. </li></ul></ul></ul>
  • 3. 1. Frameworks de Persistencia <ul><ul><li>Los desarrolladores buscaron fuera del estándar frameworks de persistencia fáciles de utilizar y fuertemente implantados en el mercado: </li></ul></ul><ul><ul><ul><li>Toplink : con licencia comercial </li></ul></ul></ul><ul><ul><ul><li>Hibernate : OpenSource y con ampliamente difundido </li></ul></ul></ul><ul><ul><li>El grupo de trabajo dentro de EJB 2.0 decidió estandarizar estas APIs, dando como resultado la definción 3.0 de EJB, el cual incluye una serie de interfaces que definen el estándar de Persistencia en Java: Java Persistence API o JPA </li></ul></ul><ul><ul><li>La gran mayoría de los frameworks existentes hasta el momento ofrecen una implementación de dicho estándar </li></ul></ul>
  • 4. 1. Object-Relational Mapping <ul><ul><li>¿Qué es un ORM ? </li></ul></ul><ul><ul><ul><li>El modelo del dominio está formado por clases </li></ul></ul></ul><ul><ul><ul><li>El modelo de BBDD está formado por tablas </li></ul></ul></ul><ul><ul><ul><li>Ambos conceptoss se parecen y están estrechamente relacionados, pero no son lo mismo </li></ul></ul></ul><ul><ul><li>Un ORM , o Object-Relational Mapping define la relación entre clases de un modelo y tablas de una BBDD, haciendo que las instancias de dichas clases puedan ser almacenadas en tablas de la BBDD de forma automática y que, a su vez, el contenido de las tablas pueda ser manejado como objetos. </li></ul></ul>
  • 5. 1. Object-Relational Mapping <ul><ul><li>Un ORM ideal: </li></ul></ul><ul><ul><ul><li>Debe manejar objetos, no tablas </li></ul></ul></ul><ul><ul><ul><li>Requiere que el mapeo se realice por alguien con conocimientos de la tecnología ORM, no vale alguien qué no conozca mínimamente su funcionamiento </li></ul></ul></ul><ul><ul><ul><li>Debe ser todo lo transparente que se pueda, aunque debe permitir el control de los objetos y su ciclo de vida </li></ul></ul></ul><ul><ul><ul><li>Debe ser simple y eficiente, ya que si no puede causar más problemas que soluciones aporte </li></ul></ul></ul>
  • 6. 1. Java Persistence API <ul><ul><li>JPA es un framework de persistencia Java, ligero y basado en POJOs o beans. </li></ul></ul><ul><ul><li>Permite definir el mapeo objeto-relacional aunque también ofrece soluciones arquitecturales para integrar la persistencia en aplicaciones que requieran alta escalabilidad </li></ul></ul><ul><ul><li>Define un lenguaje que permite lanzar consultas sobre las entidades y sus relaciones, basado en EJB QL, llamado J ava Persistence Query Language o JPQL </li></ul></ul><ul><ul><li>La configuración se realiza con un pequeño fichero XML y las relaciones o metadatos de las entidades se definen mediante anotaciones en las propios beans (aunque también se pueden definir en el fichero XML anterior) </li></ul></ul>
  • 7. 2. Entidades <ul><ul><li>Una entidad es algo que tiene atributos y relaciones y todos ellos deben ser persistidos </li></ul></ul><ul><ul><ul><li>En esencia es un nombre o un grupo de estados asociado es una única unidad </li></ul></ul></ul><ul><ul><li>En el paradigma de Orientación a Objetos, una entidad se modela como un objeto que puede mantener relaciones con otros objetos </li></ul></ul>
  • 8. 2. Entidades <ul><ul><li>¿Qué es lo que convierte un objeto en una entidad? </li></ul></ul><ul><ul><ul><li>Persistibilidad : deben poder ser almacenados en un almacén de datos y recuperados posteriormente </li></ul></ul></ul><ul><ul><ul><li>Identidad : debe poder ser identificado de forma única </li></ul></ul></ul><ul><ul><ul><li>Transaccionalidad : solo es posible crear entidades, actualizarlas o borrarlas en el contexto de una transacción.  </li></ul></ul></ul><ul><ul><ul><li>Granularidad : las entidades son un agregado de tipos básicos o de grano fino y pueden mantener relaciones con otras entidades </li></ul></ul></ul>
  • 9. 2. Entidades <ul><ul><li>Metadatos de la entidad </li></ul></ul><ul><ul><ul><li>Mediante anotaciones en las clases </li></ul></ul></ul><ul><ul><ul><li>Definidos en un fichero XML </li></ul></ul></ul><ul><ul><li>JPA provee una configuración por defecto para las entidades, siendo solo necesario especificar aquellos metadatos que sean una excepción al valor por defecto </li></ul></ul>
  • 10. EJERCICIO <ul><ul><li>Crea un bean Persona, con los atributos: </li></ul></ul><ul><ul><ul><li>nombre </li></ul></ul></ul><ul><ul><ul><li>apellidos </li></ul></ul></ul><ul><ul><ul><li>edad </li></ul></ul></ul><ul><ul><li>Utiliza la anotación @Entity sobre la clase para definirlo como entidad </li></ul></ul><ul><ul><li>Define un atributo del bean como el atributo identificativo de la entidad anotándolo con @Id </li></ul></ul>
  • 11. 2. Entidades <ul><ul><li>El Gestor de Entidades o Entity Manager es el componente de JPA que encapsula prácticamente toda la funcionalidad del API: </li></ul></ul><ul><ul><ul><li>Permite persistir y recuperar entidades </li></ul></ul></ul><ul><ul><ul><li>El conjunto de instancias de entidades gestionadas por el Entity Manager se llama contexto de persistencia </li></ul></ul></ul><ul><ul><ul><li>No es posible que dentro de un contexto de persistencia existan dos entidades del mismo tipo con la misma identidad </li></ul></ul></ul><ul><ul><ul><li>Un gestor de persistencia gestiona un número limitado de tipos de entidades, aunque pueden utilizarse distintos gestores que gestionen contextos disjuntos </li></ul></ul></ul><ul><ul><ul><li>Los gestores de persistencia están implementados por distintos proveedores de persistencia </li></ul></ul></ul>
  • 12. EJERCICIO <ul><ul><li>Obtén un EntityManager con el siguiente código: </li></ul></ul><ul><li>EntityManagerFactory emf = Persistence.createEntityManagerFactory(&quot;curso_jpa&quot;); </li></ul><ul><li>EntityManager em = emf.createEntityManager(); </li></ul><ul><ul><li>Utilizando el EntityManager, persiste el bean creado anteriormente utilizando el siguiente código: </li></ul></ul><ul><li>em.getTransaction().begin(); </li></ul><ul><li>em.persist(persona); </li></ul><ul><li>em.getTransaction().commit(); </li></ul>
  • 13. EJERCICIO <ul><ul><li>Cierra el EntityManager y el EntityManagerFactory antes de finalizar la ejecución del código: </li></ul></ul><ul><li>em.close(); </li></ul><ul><li>emf.close(); </li></ul><ul><ul><li>Ejecuta el código creado sobre una BBDD vacía y comprueba el resultado en la BBDD </li></ul></ul>
  • 14. 3. Anotaciones básicas en JPA <ul><ul><li>Definir una clase como entidad: @Entity   </li></ul></ul><ul><ul><li>Marcar un atributo como identificativo: @Id  </li></ul></ul><ul><ul><li>Mapear una tabla: @Table(name=&quot;nombre&quot;, schema=&quot;esquema&quot;) </li></ul></ul><ul><ul><li>Mapear atributos: @Column(name=&quot;nombre&quot;) </li></ul></ul><ul><ul><li>Marcar un atributo como objeto grande : @Lob </li></ul></ul><ul><ul><li>Carga perezosa de un atributo: @Basic(fetch=FetchType.LAZY) </li></ul></ul><ul><ul><ul><li>FetchType.LAZY </li></ul></ul></ul><ul><ul><ul><li>FetchType.EAGER </li></ul></ul></ul>
  • 15. 3. Anotaciones básicas en JPA <ul><ul><li>Tipos enumerados: @Enumerated(EnumType.STRING) </li></ul></ul><ul><ul><ul><li>EnumType.STRING </li></ul></ul></ul><ul><ul><ul><li>EnumType.ORDINAL </li></ul></ul></ul><ul><ul><li>Datos temporales: @Temporal(TemporalType.DATE) </li></ul></ul><ul><ul><ul><li>TemporalType.DATE </li></ul></ul></ul><ul><ul><ul><li>TemporalType.TIME </li></ul></ul></ul><ul><ul><ul><li>TemporalType.DATESTAMP </li></ul></ul></ul><ul><ul><li>Para que un atributo sea ignorado por JPA debemos utilizar el modificador transient o la anotación @Transient </li></ul></ul>
  • 16. 3. Anotaciones básicas en JPA <ul><ul><li>Generación de identificadores automática: podemos utilizar la anotación @GeneratedValue sobre el identificador de una entidad para que se le asigne un identificador de forma automática cuando sea persistida </li></ul></ul><ul><ul><li>Existen varias estrategias para asignar estos identificadores: </li></ul></ul><ul><ul><ul><li>Automática ( strategy=GenerationType.AUTO ): utiliza una de las siguientes estrategias, en función de la implementación </li></ul></ul></ul><ul><ul><ul><li>Mediante tabla ( strategy=GenerationType.TABLE ): utiliza una tabla para almacenar distintos identificadores asignados de forma automática </li></ul></ul></ul><ul><ul><ul><li>Mediante secuencia ( strategy=GenerationType.SEQUENCE ): utiliza una secuencia de la BBDD para asignar los identificadores </li></ul></ul></ul><ul><ul><ul><li>Identidad ( strategy=GenerationType.IDENTITY ): utiliza el sistema autonumérico de la BBDD si ésta lo soporta </li></ul></ul></ul>
  • 17. EJERCICIO <ul><ul><li>Modifica la entidad Persona: </li></ul></ul><ul><ul><ul><li>El identificador debe ser generado automáticamente. Prueba distintos métodos y comprueba el resultado en BBDD </li></ul></ul></ul><ul><ul><ul><li>Mapea contra una tabla distinta y cambia el nombre a alguno de los atributos en la BBDD </li></ul></ul></ul><ul><ul><ul><li>Utiliza un atributo de tipo enumerado para indicar la situación laboral (Cuenta_Ajena, Cuenta_Propia, Estudiante, Paro). Utiliza los dos tipos de mapeos para tipos enumerados y comprueba la BBDD. </li></ul></ul></ul>
  • 18. 4. Relaciones entre entidades <ul><li>Relaciones Muchos a Uno </li></ul><ul><li>@Entity </li></ul><ul><li>public class Empleado { </li></ul><ul><li>... </li></ul><ul><li>@ManyToOne </li></ul><ul><li>private Departamento departamento; </li></ul><ul><li>... </li></ul><ul><li>} </li></ul><ul><ul><li>Si queremos modificar el nombre de la columna que se utilizará para hacer join , debemos añadir la anotación @JoinColumn(name=&quot;columna) </li></ul></ul>
  • 19. 4. Relaciones entre entidades <ul><li>Relaciones Uno a Uno (bidireccionales) </li></ul><ul><li>@Entity </li></ul><ul><li>public class Empleado { </li></ul><ul><li>... </li></ul><ul><li>@OneToOne </li></ul><ul><li>@JoinColumn(name=&quot;parking_id&quot;) </li></ul><ul><li>private Parking parking; </li></ul><ul><li>... </li></ul><ul><li>} </li></ul><ul><li>@Entity </li></ul><ul><li>public class Parking { </li></ul><ul><li>... </li></ul><ul><li>@OneToOne(mappedBy=&quot;parking&quot;) </li></ul><ul><li>private Empleado empleado; </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
  • 20. 4. Relaciones entre entidades <ul><li>Relaciones Uno a Muchos </li></ul><ul><ul><li>Partimos del ejemplo Empleado de Muchos a Uno. En este caso la entidad propietaria siempre es la de la parte del &quot;Muchos&quot; y en dicha entidad debe utilizarse una anotacion @ManyToOne: </li></ul></ul><ul><li>@Entity </li></ul><ul><li>public class Departamento { </li></ul><ul><li>... </li></ul><ul><li>@OneToMany(mappedBy=&quot;departamento&quot;) </li></ul><ul><li>private Collection<Empleado> empleados; </li></ul><ul><li>... </li></ul><ul><li>// sin usar genéricos </li></ul><ul><li>//@OneToMany(mappedBy=&quot;departamento&quot;, targetEntity=Empleado.class) </li></ul><ul><li>//private Collection empleados; </li></ul><ul><li>... </li></ul><ul><li>} </li></ul><ul><li>@Entity </li></ul><ul><li>public class Empleado { </li></ul><ul><li>... </li></ul><ul><li>@ManyToOne </li></ul><ul><li>private Collection<Empleado> empleados; </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
  • 21. 4. Relaciones entre entidades <ul><li>Relaciones Uno a Muchos </li></ul><ul><ul><li>También es posible usar otro tipo de colecciones para establecer asociaciones entre entidades </li></ul></ul><ul><li>@Entity </li></ul><ul><li>public class Departamento { </li></ul><ul><li>... </li></ul><ul><li>@OneToMany(mappedBy=&quot;departamento&quot;) </li></ul><ul><li>@MapKey(name=&quot;nombre&quot;) </li></ul><ul><li>private Map<String, Empleado> empleados; </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
  • 22. 4. Relaciones entre entidades <ul><li>Relaciones Muchos a Muchos </li></ul><ul><li>@Entity </li></ul><ul><li>public class Empleado { </li></ul><ul><li>... </li></ul><ul><li>@ManyToMany </li></ul><ul><li>private Collection<Proyecto> proyectos; </li></ul><ul><li>... </li></ul><ul><li>} </li></ul><ul><li>@Entity </li></ul><ul><li>public class Proyecto { </li></ul><ul><li>... </li></ul><ul><li>@ManyToMany(mappedBy=&quot;proyectos&quot;) </li></ul><ul><li>private Collection<Empleado> empleados; </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
  • 23. 4. Relaciones entre entidades <ul><li>Relaciones Muchos a Muchos </li></ul><ul><ul><li>Modificación del nombre y columnas de la tabla de asociación </li></ul></ul><ul><li>@Entity </li></ul><ul><li>public class Empleado { </li></ul><ul><li>... </li></ul><ul><li>@ManyToMany </li></ul><ul><li>@JoinTable(name=&quot;EMP_PROY&quot;, </li></ul><ul><li>    joinColumns=@JoinColumn(name=&quot;EMP_ID&quot;), </li></ul><ul><li>    inverseJoinColumn=@JoinColumn(name=&quot;PROY_ID&quot;)) </li></ul><ul><li>private Collection<Proyecto> proyectos; </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
  • 24. 5. Operaciones con entidades <ul><ul><li>Persistencia: </li></ul></ul><ul><ul><ul><li>em.persist(entidad); </li></ul></ul></ul><ul><ul><li>Recuperación por ID: </li></ul></ul><ul><ul><ul><li>Entidad entidad = em.find(Entidad.class, id); </li></ul></ul></ul><ul><ul><li>Eliminación: </li></ul></ul><ul><ul><ul><li>em.remove(entidad); </li></ul></ul></ul><ul><ul><li>Querys </li></ul></ul><ul><li>Query query =     em.createQuery(&quot;SELECT e FROM Entidad e WHERE e.id > 100&quot;); </li></ul><ul><li>Collection entidades = query.getResultList(); </li></ul>
  • 25. EJERCICIO <ul><ul><li>Crea las siguientes entidades y sus relaciones </li></ul></ul>

×