Está en la página 1de 5

27/12/13

Que es JPA?

Aprendiendo Java
Bienvenido(a), Visitante . Por favor, ingresa o regstrate. Siempre Ingresar Buscar Noticias: Download NetBeans IDE

Ingresar con nombre de usuario, contrasea y duracin de la sesin

Inicio

Forum

Ayuda

Buscar

Ingresar

Registrarse

Aprendiendo Java General JPA Que es JPA? anterior prximo Pginas: [1]
I M P RI M I R

Autor Fz
Administrator Newbie

Tema: Que es JPA? (Ledo 20121 veces)


Que es JPA?
: junio 25, 2010, 03:10:43 pm

Mensajes: 13

JPA es un framework de persistencia, que nos abstrae de las bases de datos y nos brinda un estandar para persistir los datos en java. JPA viene a solucionar el vacio que hay entre utilizar objetos y persistirlos en una DB relacional. Como todos sabemos java trabaja con el paradigma orientado a objetos, pero que pasa cuando quiero guardar mis datos? Podria utilizar DB orientadas a objetos, pero con el tiempo estas no han podido imponerse a las relacionales, cuyo punto fuerte es SQL, un estandar para la consultas. JPA mapea automaticamente nuestras clases en la base de datos de manera transparente, y utilizando un estandar, lo cual entre otras cosas nos permite poder migrar de motor cuando quieramos, y poder compartir codigo o trabajar en equipo sin ningun problema. JPA trabaja fuertemente con anotaciones. Para mapear un bean (una clase java) con una tabla de la base de datos, tendriamos que escribir lo que se llama un Entity. Esto es tan sencillo como escribir nuestro Bean, con sus atributos y metodos get y set. Y despues aadirle la anotacion @Entity a la par que seleccionamos uno de sus atributos como clave primaria con @Id. Por ejemplo, el siguiente trozo de codigo podria ser un Entity, que nos permitiria luego almacenar, recuperar, o actualizar campos sobre una tabla usuario:
Cdigo: [Se le ccionar]

@ E n t i t y p u b l i cc l a s sU s u a r i o { @ I d p r i v a t eS t r i n gi d ; p r i v a t eS t r i n gn a m e ;

www.aprendiendojava.com.ar/index.php?topic=54.0

1/5

27/12/13
p r i v a t eS t r i n ge m a i l ; }

Que es JPA?

Con solo esto ya tenemos creada una entidad llamada Usuario y podriamos insertar, actualizar o eliminar entradas en una tabla llamada Usuario aunque esta aun no existe, siquiera. Un fichero muy importante que tenemos que crear a parte de las clases Entity es el fichero persistence.xml, en este fichero vamos a indicar precisamente que clases son Entity, sobre que base de datos vamos a atacar, y cual es la poltica de creacion de esta base de datos. Este fichero tiene los datos de la conexin a la base de datos, la cual ya debe estar creada anteriormente. En el caso de las tablas no es necesario, JPA automticamente crea las tabas necesarias a partir de las entidades que poseamos (en caso que tengamos habilitada dicha caracteristica). El fichero xml se estructura de la siguiente forma: - Tiene un nombre EjemploPU en el tag , este es importante, pues luego es por ese nombre por el que podremos acceder a este recurso o unidad de persistencia. Aqui se llama EjemploPU pero puedes darle el nombre o alias que quieras. - Entre y vamos aadiendo todas las clases Entity que queremos manipular. Esto tambien es muy importante, porque si creas un Entity pero no lo aades a esta seccion del XML, para JPA no existe. - Y por ultimo estan los properties. En estos properties estamos definiendo el mecanismo de conexion a la base de datos. Cambiando estos valores por los adecuados podemos conectar a cualquiera otra base de datos que tengamos. - Existe una ultima propiedad que conviene tener activa en los primeros momentos, cuando estamos desarrollando: Esta propiedad hace que si el modelo de datos no existe se cree de manera automatica, pero cada vez que invocamos al mecanismo de persistencia, borra el contenido de las tablas y las vuelve a crear si no existen previamente. Esto al comienzo cuando estamos de pruebas viene de fabula, despues ya podemos comentar esta opcion para trabajar con datos reales que tengamos insertados. Tenemos los Entity ya creados. Como puedo por ejemplo, insertar uno de ellos en la base de datos. Pues con un trozo de codigo similar al siguiente: - Primero creamos un EntityManager que nos permita manipular y trabajar con los objeto Entity:
Cdigo: [Se le ccionar]

E n t i t y M a n a g e r F a c t o r yf a c t o r y=P e r s i s t e n c e . c r e a t e E n t i t y M a n a g e r F a c t o r y ( " E j e m p l o P U " ,S y s t e m . g e t P r e m=f a c t o r y . c r e a t e E n t i t y M a n a g e r ( ) ;

Como ves, el nombre que uso es EjemploPU, esto es porque asi lo tenemos definido en el fichero persistence.xml, asi sabe como recuperar las clases y propiedades que corresponden a esta unidad de persistencia. Si tu cambiaste el nombre en el XML, aqui deberias poner el que hayas usado.
www.aprendiendojava.com.ar/index.php?topic=54.0 2/5

27/12/13

tu cambiaste el nombre en el XML, aqui deberias poner el que hayas usado. Una vez creada la EntityManager, ya es muy simple, abrir una transaccion e incluso almacenar elementos (Entity) en la base de datos. Un ejemplo para insertar un Usuario podria ser:
Cdigo: [Se le ccionar] e m . g e t T r a n s a c t i o n ( ) . b e g i n ( ) ; U s u a r i ou=n e wU s u a r i o ( ) ; u . s e t I d ( 1 0 0 ) ; u . s e t N a m e ( " j o s e " ) ; u . s e t E m a i l ( " n o t e n g o @ g m a i l . c o m " ) ; e m . p e r s i s t ( u ) ; e m . f l u s h ( ) ; e m . g e t T r a n s a c t i o n ( ) . c o m m i t ( ) ;

Que es JPA?

Como se puede ver, hemos recuperado una transaccion (getTransaction), instanciado un objeto usuario, asignado valores a sus atributos, lo hemos persistido (almacenado) en la base de datos con persist y por ultimo un commit de la transaccion. Es decir, solo escribiendo una clase, y un XML, ya hemos insertado un usuario con campos nombre y email en una tabla Usuarios que se ha generado de manera dinamica. No te parece ideal?. No hay que escribir metodos, insert, update ni delete, ni crear el modelo de la tabla si no nos interesa. Todo se hace dinamicamente. Consultas: Para hacer las consultas en JPA se emplea un lenguaje denominado JPQL, no es SQL exactamente porque trabaja con objetos no con columnas pero si muy parecido. Por ejemplo, si la consulta de todos los campos de una tabla es SELECT * FROM USUARIOS, en JPQL la consulta seria SELECT u FROM Usuario u, Donde Usuario no es el nombre de una tabla, sino de la clase Entity y u son los identificadores del objeto. Mas ejemplos: SELECT u.id,u.name FROM Usuario u where u.name LIKE := PARAMETRO. Es muy parecido a construir un PreparedStatement donde pasamos los parametros. Para ejecutar estas consultas empleamos el objeto Query. Query admite dos metodos:

- getResultList, cuando el conjunto de valores devuelto es una lista de valores, por ejemplo un SELECT de varios campos. - getSingleResult, cuando solo se devuelve un unico objeto (fila). Por ejemplo para obtener Todos los clientes de una tabla Clientes:
Cdigo: [Se le ccionar] Q u e r yq=e m . c r e a t e Q u e r y ( " S E L E C TcF R O MC l i e n t ec " ) ; L i s t < C l i e n t e >c l i e n t e s =q . g e t R e s u l t L i s t ( ) ; i n tn u m _ c l i e n t e s =c l i e n t e s . s i z e ( ) ;

Si quisieramos ejecutar consultas con parametros, las variables a sustituir van precedidas de : y debemos pasarlas con setParameter. Ejemplo: una consulta de Clientes cuyo id es 666 seria:
Cdigo: [Se le ccionar]

www.aprendiendojava.com.ar/index.php?topic=54.0

3/5

27/12/13
Cdigo: [Se le ccionar]

Que es JPA?
Q u e r yq=e m . c r e a t e Q u e r y ( " S E L E C TcF R O MC l i e n t ecW H E R Ep . i d:=C L I E N T E _ I D " ) ; q . s e t P a r a m e t e r ( " C L I E N T E _ I D " , " 6 6 6 " ) ; C l i e n t em i C l i e n t e B u s c a d o=( C l i e n t e )q . g e t S i n g l e R e s u l t ( ) ;

Como se puede, estamos trabajando con objetos no con clausulas SQL. Y tenemos que tener esas consultas JPQL embebidas en el codigo? Aqui tenemos otra ventaja de JPA, Si no queremos, no tenemos porque. Podemos si queremos definir anotaciones con las sentencias SQL en el cuerpo del Entity, estas sentencias SQL se indicarian con la anotacion @NamedQuery. Un ejemplo: Fijate en el codigo del Entity, es una clase llamada Usuario que implementa los datos de un usuario. Con @Entity ya indicamos que es una entidad. con @Table ya forzamos a que se mapee con una tabla llamada Usuarios, en caso de no usar la anotacion @Table, el nombre de la tabla creada se llama exactamente igual al nombre de la clase java. Con la anotacion @NamedQueries vamos indicando las diferentes sentencias SQL que queremos utilizar,en realidad sentencias JPQL. Y esto es fantastico otra vez, pues al ser anotaciones, podemos cambiarlas sobre la marcha. Aqui aprovecho y comento otras anotaciones de las que no habia hablado, ya vimos que con @Id vamos indicando que columnas son clave. Pues bien con @GeneratedValue podemos indicar si queremos que los campos clave se creen de manera automatica, por ejemplo mediante el uso de secuencias. En otro caso, somos nosotros los que debemos calcular el valor de un nuevo id cuando vayamos a insertar, o Podemos elegir Identity y que se genere una clave autoincremental. Otra anotacion es @Column nos permite asociar un atributo a un nombre de columna en particular. Por ejemplo tenemos un atributo llamado fCreacion pero en la base de datos la columna se llama FECHA_CREACION. En caso de no indicarlo, las columnas de la tabla se llamaran igual que el nombre del atributo del Entity. En el caso de que queramos usar las anotaciones @NamedQuery, si que cambia un poco la forma de invocar a Query que vimos un poco mas arriba. y es que en este caso, en lugar de usar un createQuery(String con el JPSQL), debemos usar createNativeQuery(nombre_de_la_anotacion_namedQuery_definida_en_el_Entity). Por ejemplo si tuvieramos:
Cdigo: [Se le ccionar] @ N a m e d Q u e r y ( n a m e=" U s u a r i o . f i n d B y I d " ,q u e r y=" S E L E C TuF R O MU s u a r i o "+ " uW H E R Eu . i d=: i d " )

La consulta podria ser:


Cdigo: [Se le ccionar] Q u e r yq=e m . c r e a t e N a t i v e Q u e r y ( " U s u a r i o . f i n d B y I D " ) ; q . s e t P a r a m e t e R ( " i d " , " 1 0 0 " ) ; U s u a r i ou=q . g e t S i n g l e R e s u l t ( ) ;

www.aprendiendojava.com.ar/index.php?topic=54.0

En este punto tambien comentar que en entornos de desarrollo (Eclipse, netbeans) puede hacerse el paso inverso, es decir, a partir de una base de datos, generar el Entity correspondiente. A este proceso se le llama Ingenieria inversa. Pero no lo cubriremos en este articulo. Podeis de todas formas obtener mas informacion en el sitio de Eclipse o en

4/5

27/12/13

Podeis de todas formas obtener mas informacion en el sitio de Eclipse o en Netbeans. De todas formas, pienso que lo mas comodo es escribirlo uno mismo (ademas el Entity es un simple bean). El netbeans, nos crea automaticamente las entidades, las Unidades de Persistencia, y tambien nos permite crear "Controladores" para las entidades, que son clases que ya tienen implementados los metodos del EntityManager. Cuando vamos a crear un nuevo archivo, buscamos en la categoria "Persistencia" y ahi encontramos lo nombrado anteriormente. Espero que les sea de ayuda. Saludos. Franco.

Que es JPA?

En lnea Pginas: [1]


I M P RI M I R

anterior prximo Aprendiendo Java General JPA Que es JPA?

Ir a:

=> JPA

ir

SMF 2.0 | SMF 2011, Sim ple Machine s XHTML R SS W AP2 Sim ple Portal 2.3.1 2008-2009, Sim ple Portal

www.aprendiendojava.com.ar/index.php?topic=54.0

5/5

También podría gustarte