Introduccion a JPA (Java Persistence API)

Vamos a programar un poco…

Antes cuando tenia que hacer una consulta en la base de datos, empleaba JDBC a “pelo” o Frameworks como iBatis e Hibernate. Eran APIs que permiten mapear una clase Java (Bean) con una tabla de la base de datos y facilitan mucho el trabajar con la persistencia de los objetos (usando metodos del estilo a “select”, “insert”, “update” y “delete”).

Pero ahora he conocido JPA y me parece que a partir de ahora sera lo unico que utilizare. Con JPA puedes hacer cosas como estas:

– Escribir el codigo de tu clase, y aunque no exista la tabla correspondiente en la base de datos, no importa!!. JPA se encargara de crear la tabla del modelo de datos. Esto esta Genial!!!, es decir, tu solo escribes el codigo y JPA con su mecanismo de persistencia ya se encargara de crear la tablas, si no existen y si existen pues las usa. Ademas da igual la base de datos, podrias por ejemplo escribir la aplicacion en MySQL y despues con un ligero cambio llevartela a Oracle.

– Sincronizacion. Viene tu jefe de proyecto y te dice, quiero que añadas dos columnas nuevas a esta tabla y elimines el campo primario de esta otra tabla. Y ya empiezas a sudar. Llevas escritas mas de 20 sentencias SQL y te toca cambiarlas. Eso se acabo. Es tan sencillo como irte al codigo de tu bean, y añadir 2 atributos nuevos que se mapearan como campos nuevos de la tabla. Chachi.

– Puedes tambien mantener la persistencia no necesariamente atacando a una base de datos, tal vez te interesaria persistir un objeto a un fichero de texto plano o XML.

Como ejemplo de uso de JPA vamos a implementar un pequeño sistema CMS personal. La idea es escribir una pequeña aplicacion que nos permita almacenar nuestros documentos en la base de datos. Y al decir “almacenar” me refiero a almacenar el contenido del documento en la propia base de datos, no su pathname o ruta en el disco duro. De esta manera aprovecharemos para ver como con JPA se hace tambien muy simple la insercion en campos BLOB de la base de datos, algo que muchas veces trae de cabeza a los desarrolladores de Java.

Este ejemplo de CMS (cuyo codigo dejo al final del articulo) sera muy simple. He preferido que el ejemplo no se complique con restricciones o constraints de la base de datos, asi que no existen tampoco claves foraneas a otras tablas. De manera que sera dificil que nos de un error, cuando intentemos insertar algun contenido. Tambien en esta primera version solo os dejare una aplicacion en modo consola (un interprete de comandos) que nos permitira ir insertando o consultando los documentos de nuestra base de datos. En otro articulo posterior, veremos como crear un interface grafico via web que nos permita manipular los documentos.

¿Que necesitamos?

– Pues un editor de Java. Puedes usar el que mas rabia te de. Eclipse, Netbeans u otro. Yo esta vez he usado Netbeans, para ir variando.
– Una base de datos. El ejemplo esta preparado para MySQL pero funcionara con ligeros cambios en Oracle u otra base de datos relacional. A su vez, no te olvides de incluir el driver JDBC de conexion a la base de datos en el Classpath.
– y por ultimo y lo mas importante, para trabajar con JPA necesitamos una implementacion de JPA. Existen muchos fabricantes que han hecho la suya (ver implementaciones). En el ejemplo yo he empleado EclipseLink, asi que basicamente, descargate esta implementacion, descomprimela y copia los siguientes .jar en el classpath de tu proyecto:

- eclipselink.jar
- javax.persistence_1.0.0.jar

En Netbeans podemos por ejemplo crear una Libreria con esos jar, que luego incluiremos en el proyecto, en Eclipse, pues bastaria con añadirlos al classpath.

Ya tenemos todo lo que necesitamos para trabajar, pero no esta de mas que te bajes la siguiente tarjeta de referencia de JPA.

Y ya puestos, la siguiente, que nunca esta de mas.

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 añadirle 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”:

@Entity
public class Usuario
{
@Id
private String id;
private String name;
private String email;
}

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. A que mola!!

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 politica de creacion de esta base de datos.
Este fichero “persistence.xml” debe colgar de un directorio “META-INF” que este accesible en el CLASSPATH. Esto es, si tu codigo por ejemplo lo estas dejando en la carpeta “src”, tendras que crear una carpeta “src/META-INF” y ahi dentro crear el fichero “persistence.xml”.
El contenido de este fichero es similar al que puedes ver en la siguiente imagen:

Fijate en el XML un momento:

– Tiene un nombre “DOCSPU” 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 “DOCSPU” pero puedes darle el nombre o alias que quieras.

– Entre y vamos añadiendo todas las clases Entity que queremos manipular. Esto tambien es muy importante, porque si creas un Entity pero no lo añades 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:


String UNIDAD_DE_PERSISTENCIA = "DOCSPU";
EntityManagerFactory factory = Persistence.createEntityManagerFactory(UNIDAD_DE_PERSISTENCIA, System.getProperties());
em = factory.createEntityManager();

Como ves, el nombre que uso es “DOCSPU”, 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.

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:

em.getTransaction().begin();
Usuario u = new Usuario();
u.setId(100);
u.setName("jose");
u.setEmail("notengo@gmail.com");
em.persist(u);
em.flush();
em.getTransaction().commit();

Como observas, 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 proyectos de una tabla “Proyectos”:

Query q = em.createQuery("SELECT p FROM MdcoreProject p");
List<MdcoreProject> proyectos = q.getResultList();
int num_proyectos = proyectos.size();

Si quisieramos ejecutar consultas con parametros, las variables a sustituir van precedidas de “:” y debemos pasarlas con setParameter. Ejemplo: una consultas de proyecto cuyo proyecto es “666” seria:

Query q = em.createQuery("SELECT p FROM MdcoreProject p WHERE p.id : = PROYECTO_ID");
q.setParameter("PROYECTO_ID","666");
MdcoreProject mi_proyecto_buscado = (MdcoreProject) q.getSingleResult();

Como veis, estamos trabajando con “objetos” no con clausulas SQL.

¿Y tenemos que tener esas consultas JPQL embebidas en el codigo?

Pues 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 “MdcoreUser” 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 “MDCORE_USER”, 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, bueno, perdon… 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. Otra anotacion es @Column nos permite asociar un atributo a un nombre de columna en particular. Por ejemplo tenemos un atributo llamado “fxCreacion” 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:

@NamedQuery(name = "MdcoreUser.findById", query = "SELECT s FROM MdcoreUser " +
"s WHERE s.id = :id")

La consulta podria ser:

Query q = em.createNativeQuery("MdcoreUser.findByID");
q.setParameteR("id","100");
MdcoreUser u = q.getSingleResult();

En este punto tambien comentar que en estos 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 Netbeans. De todas formas, pienso que lo mas comodo es escribirlo uno mismo (ademas el Entity es un simple bean).

Ejemplo CMS:

Como se que esto al principio es complicado, aunque luego se le pilla el truco. Os dejo unos cuantos ficheros fuente con un ejemplo de aplicacion JPA. Solo incluyo los fuentes, para que no pese mucho, los .jar correspondientes a EclipseLink y driver JDBC debeis colgarlos vosotros.

Esta pequeña aplicacion es un interprete de comandos que nos permite insertar documentos en la base de datos en base a tags, por ejemplo podriamos insertar un documento “Introduccion a JPA.pdf” bajo los tags “Programacion,Java,JPA”. Consultar documentos en base a su tag (p.ej devolver todos los documentos almacenados que sean de la categoria: “Oracle”) y descargar documentos.

Usa varias tablas, pero la mas importante es MdcoreDocs. Realmente las demas son solo para un desarrollo a mayor nivel. Las tablas son:

– MdcoreUser, Guarda informacion de los usuarios
– MdcoreProject, Guarda informacion de los proyectos
– MdcoreMetadata, Guarda metadatos del proyecto (p.ej DOCUMENTOS, SCRIPTS…)
– MdcoreTags, Tags de los diferentes docs (Oracle, Java, Bases de datos, MySQL, etc..)
– MdcoreDocs, Los documentos almacenados en la base de datos.
– MdcoreSetDocTags, Permite asociar documentos con tags

Para simplificar no hay relaciones activas entre tablas, y por defecto cuando se inserta un documento en la base de datos, se asigna de manera automatica a un proyecto=0, usuario=1, metadato=1
(el proyecto 0 vendria a ser: DEFECTO).

El interprete de comandos se lanza con la clase MyDocs. Este seria por ejemplo una sesion donde almacenamos un documento en la base de datos:

Y aqui el resultado de insertar en la base de datos (nota que no he creado el modelo de datos, se crea de manera automatica):

Un Blob insertado en MySQL de la manera mas rapida y sencilla posible ^^

Este ha sido un tutorial muy basico, unicamente para que conozcais esta API y tal vez os sirva de ayuda para empezar a mapear vuestros Entity. no creo que siga con los tutoriales, pero con JPA se pueden hacer cosas mas complejas y establecer asociaciones 1 a 1 y 1 a M entre las tablas. Esperemos que Hermoso dia se anime y continue con algun tutorial mas avanzado. (Gracias Lechuck por enseñarme este API).

Como prometi, aqui los fuentes (estan como .pdf realmente son .tar, renombra de .pdf a .tar y descomprimelos, los subo asi, pq wordpress solo dejar subir pdfs e imagenes).

Enlace | Ejemplo de JPA, Codigo fuente
Enlace | Introduccion a JPA, Tutorial de Sun

60 Responses to “Introduccion a JPA (Java Persistence API)”


  1. 1 superpiwi octubre 20, 2008 de 11:42 pm

    1:40 de la mañana… y durmiendo…

  2. 3 LeChuckNorris octubre 21, 2008 de 6:36 am

    Muy buen artículo SuperPiwi y gracias por la mención 😉

    Yo hasta ahora había usado siempre Hibernate y alguna vez por requerimientos del cliente iBatis, framework del que personalmente huyo siempre que puedo. En el último proyecto me he lanzado a usar JPA principalmente porque es un estandar y por cambiar un poco. La verdad es que de momento estoy muy contento con la elección.

  3. 4 El Barto octubre 21, 2008 de 2:56 pm

    Muy interesante SuperPiwi.

    Siempre me generan cierto escozor los frameworks que generan las queries, sobre todo porque las cosas se complican en aplicaciones de alta demanda a la hora de optimizar las queries. Pero esto parece bastante interesante y flexible como para permitir varias cosas interesantes.

    Sin embargo, me pregunto qué pasará con esa sintaxis SQL particular (ej. “SELECT u FROM User u”), si uno necesita usar hints de Oracle, por ejemplo.

    Saludos

  4. 6 Oscar octubre 31, 2008 de 4:58 pm

    Hola me intersea mucho poder ver el ejemplo pero me da un error????

  5. 8 6€€K M€L0M@N0 noviembre 20, 2008 de 2:37 am

    Muchas gracias tu publicación me ayudó bastante con un proyecto que tenía, sino lo hubiera hecho como tu dices con JDBC a pelo.

  6. 9 oskqar noviembre 27, 2008 de 4:09 pm

    ta bueno el articul si tienes algo mas avanzado envialo porfa, estamos aprendiendo gracias

  7. 11 FERNANDO diciembre 19, 2008 de 10:58 pm

    Como implemento la herramienta que presentas en la imagen en Netbeans?

  8. 13 Bakidok diciembre 22, 2008 de 4:11 pm

    El link del codigo fuente del ejemplo parece que está corrupto, porque se baja un .pdf y al intentar-lo abrir dá error.

    Lo podrias corregir? porque el ejemplo me interesa bastante.

  9. 14 JomDever diciembre 22, 2008 de 5:40 pm

    Hola,

    He tratado hacer funcionar jpa con ms access pero no funciona.. tal vez sea mejor así, lo que en realidad quiero es que la base de datos quede en un archivo de tal modo que la aplicación sea completamente portable sin instalar servidores de BD adicionales.

    Tal vez, una de las opciones seria llevarlo a un archivo de texto plano o xml. ¿Como lo hago?

    ¿Sugerencias?

    Gracias!!!

  10. 15 superpiwi diciembre 22, 2008 de 6:12 pm

    @JomDever

    si, lo comentaba al final del articulo:

    Como prometi, aqui los fuentes (estan como .pdf realmente son .tar, renombra de .pdf a .tar y descomprimelos, los subo asi, pq wordpress solo dejar subir pdfs e imagenes).

    Tienes que renombrar el PDF a .TAR (realmente son ficheros .tar no .pdfs)

  11. 16 superpiwi diciembre 22, 2008 de 6:25 pm

    @jomdever

    Tal vez te pueda servir usar SQLite, es una base de datos que puedes embeber en un fichero. Yo la uso a veces para desarrollos locales y luego ya migro a una base de datos mas destinada a produccion.
    Eso si, es muy simple, pero para campos simples de Access creo que te podria servir.
    Respecto a usar JPA con Access no te puedo ayudar :-S no uso Access desde hace mas de 8 años, estoy mas enfocado a Teradata, MySQL y Oracle.
    Los ejemplos de JPA si que los he probado en MySQL y Oracle y funcionan perfectamente con ligeros cambios.
    En MS Access tal vez dependa del driver JDBC que estes usando para conectar.
    Creo que existia uno implementado completamente en Java, puede que ese driver de conexion te vaya mejor, no el que usa el JDBC-ODBC. Pero ahora no recuerdo el nombre.

  12. 17 santiago diciembre 23, 2008 de 3:35 pm

    Hola.

    Después de bucear en internet y no encontrar información, he realizado yo mismo unas pruebas y he publicado un artículo con una comparativa de implementaciones de JPA (Hibernate, Toplink, Eclipselink y Openjpa) que puede que resulte interesante:
    http://terrazadearavaca.blogspot.com/2008/12/comparativa-de-implementaciones-de-jpa.html

    Un saludo.

  13. 18 ivan enero 12, 2009 de 6:41 pm

    el link Ejemplo de JPA, Codigo fuente, no me funciona

  14. 19 Nadoiz enero 15, 2009 de 3:29 pm

    Traté de evitarlo pero no encontré infomación que conectar la JPA con un archivo XML, en netbeans me pide que la impementacion JPA tenga alguna coneccion y siempre llego a los mismos jdbc.
    Despues busqué un jdbc para los xml … lo mas cerca que encontré fue xlSql pero me pareció que necesita igual de un jdbc de mysql o de la bd en si.
    ¿Alguna idea para poder utilizar persistencia con un archivo XML o texto plano?

    Saludos

  15. 20 santiago enero 19, 2009 de 10:26 am

    Hola.

    He publicado una nueva comparativa de implementaciones JPA: Toplink Essentials, Openjpa, Eclipselink, Hibernate. En esta comparativa no se utiliza ninguna tecnología adicional y además he puesto el código fuente disponible para el caso de que alguno quiera repetir las pruebas por sí mismo.

    Un saludo.

  16. 22 rafa enero 22, 2009 de 2:46 am

    estoy utilizando hibernate y no puedo ver la base de datos por que me sale un error

    Error while expanding hibernate

    y no puedo utilizar jpql

  17. 23 John Oliver febrero 12, 2009 de 7:54 pm

    Holas…
    Estoy muy interesado en este tema y me a llamado mucha la atencion este articulo, quisiera saber si funciona bien con sql 2005.

    Por que tengo un problema al crear las clases entidad debido a que unas tablas no tienen llaves primarias y no me permite crearlas.

    gracias de antemano…

  18. 24 bva febrero 20, 2009 de 11:04 pm

    Hola, muy bien por el ejemplo, yo lo hice y salio todo perfecto, pero tengo un pequeño o grande problemita, no lo se.

    El problema que tengo es que inicalmente solo agrege una entidad a mi proyecto, la cual di de alta en el archivo persistence.xml; esta entidad solo tiene dos campos, nombre y objeto, cuando realizo la consulta mediante anotaciones @NamedQuery todo bien, el problema es cuando agrego una nueva entidad con otro objeto de la base de datos, al momento de realizar la consulta con el primer objeto, ya no muestra ningún resultado. En Netbeans se muestra el siguiente error:

    EXCEPCION RUNTIME 1 >>>>><<<<<<<<< : java.lang.IllegalArgumentException: NamedQuery of name: Categoria.filtrar not found.

    Dado que anteriormente sin haber agregado el segundo objeto en el archivo persistence.xml si realizaba la consulta y mostraba los datos.

    NOTA: El mensaje de error lo muestra cuando doy dos veces click sobre el botón de la búsqueda, y no al primer click como debería ser.

  19. 25 robertux abril 4, 2009 de 5:59 am

    Muchísimas gracias por el artículo, me sirvió como no tenés idea, como una introducción el post está perfecto. saludos!

  20. 26 Marta mayo 19, 2009 de 8:35 am

    Genial este artículo, me ha servido de mucha ayuda, y la guía de jpa también… ahora mi proyecto por fin empieza a funcionar!!

    Quería preguntarte una cosilla… Quiero cambiar algunas columnas de mi bd… según tu se puede hacer directamente en las clases entidad? Lo hago a saco? es decir, cambio el nombre de las columnas y ya está? o lo cambio en mi servidor de base de datos (postgresql) y vuelvo a generar las tablas, llenarlas, generar las entityclasses.. etc??

    Gracias por tu ayuda!

    Marta

    • 27 piwi mayo 19, 2009 de 11:49 am

      Bueno, la idea es que lo haga JPA por ti.
      Bastaria con que añadieras o modificaras los nuevos atributos en la Entidad, y que momentaneamente descomentaras del persistence.xml o añadieras una property nueva que se llama drop_and_create_tables.

      Si haces esto, cuando vayas a ejecutar, te borrara las tablas y te creara el nuevo esquema conforme a las entidades, pero eso si, hazlo solo la primera vez y vuelve a desactivar el property, o siempre te hara el drop de tablas y si p.ej almacenas datos en las tablas desde codigo, te lo borraria.

      En Postgres por desgracia no lo llegue a probar, use SQLite, Oracle y MySQL. Pero deberia funcionar igual (espero).

  21. 30 David julio 24, 2009 de 1:50 am

    Buenas Tengo algunas dudas ojala alguien se compadesca de mi, y son: hasta done tengo entendido y si no es asi por favor ayudenme , hibernate toplink y las otras son implementaciones de la api JPA , ahora que es mejor utilizar para manejar la persistencia fisica-logica, me explico: programar directamente con JPA y no utilizar hibernate o toplink , lei por ahi q las consultas q generan estas implementciones no son muy optimas , tengo problemas confusos por favor si alguien me ayuda le agradecere en el alma.

  22. 31 Anzel septiembre 4, 2009 de 4:48 pm

    Antetodo te felicito por el gran tutorial que has redactado, me ha servido de mucho.

    Pero quería puntualizar una cosa. A la hora de usar un “NamedQuery”, cuando se desea invocar este “Query” la forma correcta sería mediante “createNamedQuery(…)” en lugar de hacerlo con “createdNativeQuery(…)”.

    Saludos.

  23. 32 MasMafra octubre 5, 2009 de 7:00 pm

    Ya habia visto tutoriales de JPA y lo utilizo bien, la unica parte q me intriga es q hay q hacer para que genere la tabla en la base de daos, quizas e omitido un paso no se. Espero respondan mi incognita. Muy buena la explicacion

    • 33 rafa agosto 5, 2010 de 11:31 am

      Hola, gracias por el tutorial, me ha servido muchísmo. Tengo una duda, mi base de datos es MS Access. ¿Me podeís decir como sería el fichero persistence.xml para que fuera posible la conexión?

      Un saludo gracias!

  24. 34 Natalia octubre 29, 2009 de 5:29 am

    Buenas, esta muy bueno el tutorial, estoy recien empezando con JPA – Hibernate y me ayudó bastante.
    Sabes que tengo un problemita con esto, tengo una clase que tiene un campo unico y con limite de largo, lo tengo definido así:

    @Column(name=”NOMBRE”, unique=true, nullable=false, length=8)
    public String getNombre() {
    return this.nombre;
    }

    y el problema me surge al guardar la entidad, cuando, por ejemplo, le pongo a dicho campo largo 10 o un valor que ya existe en la base de datos.

    Esto es parte del código del dao:

    EntityManagerHelper.beginTransaction();
    dao.update(nivel);
    EntityManagerHelper.commit();

    El error me salta en el commit, lo que creo es correcto, pero me pasa que luego quiero acceder a la entidad y me salen los datos que ingrese erroneamente. En la base no se modificaron los datos, pero parecería que en la “memoria” de hibernate si. Espero haberme explicado y más espero aún que me puedas ayudar.

    No entiendo como debería funcionar esto, capaz que esta bien, no se.

    Gracias, gracias

  25. 35 zacman octubre 29, 2009 de 6:31 pm

    Saludos, siempre he visto que se trabaja con tablas, pero como se haria si queremos trabajar con VISTAS, FUNCIONES, PROCEDIMIENTOS ALMACEDADOS, etc. seria bueno que agregaras este tipo de informacion que es muy util en el momento de hacer un proyecto

  26. 36 mario noviembre 10, 2009 de 3:06 am

    TODO ESTO ES UNA MIERDA….EL Q NO SABE NADA NO ENTIENDE POR DONDE PUTAS EMPEZAR!!!! HACER U TUTO MEJOR MAS PARA NOVATOS NOVATOS….NO DES POR ENTENDIDAS ALGUNAS COSAS

    • 37 jose noviembre 10, 2009 de 5:30 am

      Es facil criticar eh Mario. Sin saber lo que a uno le puede costar o no hacer las cosas.
      En la red puedes encontrar mucha informacion, la misma que me lei yo para poder entender como iba esto y hacer una aplicacion.
      Mi consejo:
      Esfuerzate algo mas, a nadie le dan las cosas hechas.
      Me parece suficiente informacion de base para aprender e incluso con codigo de ejemplo que me he molestado en subir, y que es mas de lo que me encontre yo en su dia.

      • 38 klaudia_ru noviembre 12, 2009 de 4:40 am

        Si estoy completamente deacuerdo contigo jose; aunque como dice Mario hay mucha gente que es novata NOVATA, (jeje, asi como yo) y aunque ivestigues e investigues es dificil encontrar informacion para poder comenzar en Apache OpenJPA
        Ojala y alguien nos pueda ayudar con un tuto, o algo mas concreto

  27. 39 Marco Augusto marzo 23, 2010 de 11:29 pm

    Soy nuevo utilizando JPA, el articulo esta muy bueno para empezar, quisiera saber si hay una herramienta que genere las clases entidad así como lo hace netbeans para hibernate por ejemplo, ya que cuando el proyecto tiene varias entidades, es algo moroso estar creando una por una las clases entidad, o de que manera se podría agilizar esta parte del desarrollo..

    Muchas Gracias de ante mano

  28. 40 César mayo 27, 2010 de 6:03 pm

    Buen día, muy agradecido por la explicación. Me sirvió de mucho estaré preguntando cualquier cosilla. Espero sigan colgando cosas interesantes y puedan introducirnos e incluso avanzar en temas tan y más importantes como éste.

  29. 41 Julio junio 9, 2010 de 6:17 am

    Hola, he leído la mayoría de comentarios y por supuesto el post y es bastante interesante, pero como en este y en ningún otro encuentro algo que me lleve a encriptar un campo en la base de datos, algo muy importante en un buen sistema pero no hecaptado como se hace ese cmabio o si es posible, si pudieran orientarme de alguna forma, un saludo 😀

  30. 43 Fredd junio 10, 2010 de 12:33 am

    Q chvre bien explicadito y recontra basico, justo lo q necesitaba xD! thanks

  31. 44 TaT! julio 2, 2010 de 10:08 pm

    Superpiwi,

    Super !!!!!!!!! articulo me sirvio millllllll, eres lo maximo

    Muchas Gracias !!!!!!!!!!!!

  32. 45 javid julio 12, 2010 de 10:27 pm

    hola muchachos esta excelente el articulo aclara muchos interrogantes sobre el uso de JPA para los principiantes les recomiendo usar los ide como netbeans ke facilita la comunicacion con la base de datos y genera las entity, el archivo de persistencia de una forma trasnparente para los programadores, bueno ahora bien si alguien tiene informacion sobre los JPA controller ke son el siguiente paso de las entity clases le agradeceria un gusto leer todos estos buenos comentarios saludos

  33. 46 JavaMan julio 15, 2010 de 6:10 am

    Doc las fuentes de tu BLOBs para JPA no esta descargando … Haber si cuelgas las fuentes de nuevo saludos…

  34. 47 manu agosto 14, 2010 de 12:29 am

    loco en el código de descarga le pongo a la url tar? en vez de pdf?? o a que te refieres por que hasta ahora no la he podido descargar me sale
    404 — File not found.
    You can create your own free blog on WordPress.com.
    espero me puedas mandar el código para estudiarlo por lo demás muy bueno…
    ah si alguien esta interesado en Struts 2 , estoy haciendo un blog de Struts 2 con ejemplos explicados e imágenes , esto para los novatos.. alli entrare también en JPA pero para mas adelante por eso estoy leyendo info sobre esto aunque manejo un poco nunca esta demás una ayuda de otros lados… gracias por compartir
    dejo el link de mi blog si alguien se interesa en Struts 2 desde lo básico !! solo para novatos e interesados

    http://msilvaq-iweb-struts2.blogspot.com

  35. 48 doug182 octubre 24, 2010 de 2:25 pm

    si quieren descargar las fuentes, solamente hagan click derecho sobre el enlace y seleccionen “Save Link As” o “Guardar enlace como”
    y cuando te abra la ventana donde tienes que guardar el documento cambiale de pdf a tar y Listo!!

    espero haber ayudado, suerte a todos!!!

  36. 49 Ricardo febrero 27, 2011 de 1:31 pm

    El titulo de tu blog dice introduccion a JPA, pero no lo haces, no pones ninguna base de frente tomas una implementacion hecha, ni siquiera la haces tu, cuando pongas un titulo pues ponle acorde a lo que haces, confundes a los vistantes de tu blog.

  37. 50 Francisco marzo 28, 2011 de 3:53 am

    Hola, esta bueno el tutorial, lo he tomado de base para hacer un ejemplo mucho mas sencillo, simplemente una clase mapeando a una tabla. El proyecto lo he armado en eclipse, con la carpeta META-INF conteniendo el archivo persistence.xml; sin embargo a la hora de ejecutar me sale el sgte error:

    Exception in thread “main” javax.persistence.PersistenceException: No Persistence provider for EntityManager named TESTUNIT
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89)
    at test.JPATester.main(JPATester.java:14)

    Espero alguien me pueda dar alguna pista, he estado investigando y la mayoria apunta al problema de persistence.xml bajo META-INF en el classpath, sin embargo he revisado en el eclipse y creo haber hecho eso, el ejemplo esta en netbeans, alguna diferencia en hacerlo con eclipse..?

    Gracias de antemano.

  38. 51 Okar julio 21, 2011 de 4:53 am

    Excelente, muchas gracias, se nota el esfuerzo puesto en el desarrollo.

  39. 52 Lucho182 septiembre 25, 2011 de 5:54 am

    te equivocas en tus conceptos, no olvides que JPA es una especificacion, un API, pero necesita una implementacion, una de ellas es hibernate, otra EclipseLink o JDO, asi q estas implementaciones son las q verdaderamente realizan la interaccion con la base de datos y obviamente todas estas permiten crear las tablas mapeadas!!

  40. 53 persona noviembre 23, 2011 de 4:45 pm

    Hola, no se puede bajar el código fuente. ¿Podrías revisarlo?
    Gracias, el artículo es muy interesante.

  41. 54 hugo junio 27, 2012 de 1:46 pm

    muy interesante, pero que paso con los stored procedures cuando se trabaja con JPA, ya no es necesario? y en las base de datos ya existentes en las cuales hay cierta cantidad de logica programada en procedures y quisiera migrar por ejemplo a java EE, specificamente con JPA, es posible reusar esos procedures… soy nuevo en esto de los jpa

  42. 55 Mendez julio 15, 2012 de 10:53 pm

    Buenas Tardes a todos.
    Agradeceré la ayuda.
    Estoy escribiendo una consulta como sigue:
    (Documento es una lista de Tipo Documento)

    String strSql=”select c.numPemexContrato from Contrato c JOIN c.documento d where d.nombreDocumento like ‘”+parametro+”%”+”‘”;

    this.joinList = session.createQuery(strSql).list();

    //JoinList lo defino de tipo String u Object;
    al ver el valor con :
    Iterator iter = joinList.iterator();
    while (iter.hasNext()){
    //Devuelve: c-33434 (numeor de contrato)
    System.out.println(“value == “+iter.next() ) ;

    }
    Imprime el valor correcto,
    Sin embargo la siguiente consulta me devuelve tipos Object
    y lo que necesito son los valores de
    ———————————————————————————————
    String strSql=”select c.numPemexContrato, d.nombreDocumento FROM Contrato c JOIN c.documento d where d.nombreDocumento like ‘”+parametro+”%”+”‘”;

    //JoinList es de tipo Object(ya que uso dos objetos-Contrato y Documento-);
    al mostrar el valor con :
    Iterator iter = joinList.iterator();
    while (iter.hasNext()){
    //Devuelve: [Ljava.lang.Object;@36b1bb
    //(necesito el valor de c.numPemexContrato y d.nombreDocumento )
    System.out.println(“value == “+iter.next() ) ;

    }
    Si alguien aporta algo se los agradezco de antemano.

  43. 56 Paola enero 20, 2014 de 7:47 am

    buenas noche, una pregunta. ¿COmo se debe tratar a una consulta para que no se genere error, cuando no existe un resultado?. Si la variable enviada no hay en la base por lo tanto no la puede encontrar. EL resultado q me genera en consola es: “No entity found for query”.
    Para el caso de una lista he utilizado “isEmpty()” en el controlador, y me ha funcionado muy bien, pero para el caso de retorno de una solo registro no lo puedo utilizar. Y
    Porcierto Utilizo la gerarquia MVC, si hay alguien q me pueda ayudar muchas. Talves si exita una solucion, pero la verdad yo no la encuentro… gracias..

  44. 57 Vero abril 6, 2018 de 3:07 pm

    chicos, como llamo a VISTAS y PROCEDIMIENTOS en JPA? me dais un ejemplo por favor?


  1. 1 Quickly « Xonos Trackback en octubre 21, 2008 de 1:01 pm
  2. 2 Manual Avanzado de JPA « Ubuntu Life Trackback en diciembre 5, 2009 de 2:19 pm
  3. 3 Desarrollando una Aplicación JEE 6: Capa de Servicios/Logica de Negocio - Blog - Extranet Carval de Colombia Trackback en marzo 29, 2011 de 2:36 pm

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s







¿Es compatible tu equipo con Ubuntu?


( Muchos fondos de pantalla, aqui )

DESCARGATE SCIFI LIFE

365 Dias de Soledad
Me debes los sueños, las promesas y las noches rotas. Me debes la paz, la sonrisa y la esperanza robadas. Me debes la sangre, las lágrimas y el sudor vertido. Me debes las noches vacías, los abrazos anhelados. Me debes un beso de ajenjo de tu amarga boca.

The Ubuntu Counter Project - user number # 11961
Geo Visitors Map
octubre 2008
L M X J V S D
« Sep   Nov »
 12345
6789101112
13141516171819
20212223242526
2728293031  

Blog Stats

  • 30.891.638 hits

A %d blogueros les gusta esto: