Antes de ayer Carlos Oliva un lector de mi blog me preguntó si habría forma de configurar de una manera mas flexible el fichero persistence.xml. Me pareció una pregunta interesante ya que aunque muchas veces con la configuración de JPA por defecto nos es suficiente, existen otras situaciones en las que podemos necesitar una mayor flexibilidad a nivel de persistence.xml. Este fichero se suele ubicar en la META-INF de nuestra aplicación por lo menos es lo que el standard recomienda.
Ahora bien ¿puede estar el fichero persistence.xml en algún otro sitio?
Persistence.xml y classpath
La respuesta es SI el fichero de persistence.xml se puede ubicar en cualquier carpeta que pertenezca al classpath siempre que este ubicado dentro de una carpeta META-INF.
ORM.XML
De esa forma podemos ubicar el fichero de persistencia en otras rutas que nos resulten mas interesantes .Ahora bien normalmente esto no es suficiente .Cuando se precisa flexibilidad a nivel de JPA es habitual recurrir al fichero orm.xml .¿Para que sirve este fichero? . Bueno sirve para muchas cosas pero quizás su característica principal es que se usa para eliminar las anotaciones de JPA del código y substituirlas por etiquetas XML . Vamos a ver un ejemplo sencillo de este fichero.
<?xml version="1.0" encoding="UTF-8"?> <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd" version="2.0"> <package> com.arquitecturajava </package> <entity class="Persona"> <attributes> <id name="nombre"></id> <basic name="edad"></basic> </attributes> </entity> </entity-mappings>
Como podemos ver el fichero incluye los mismos conceptos elementales de JPA pero en vez de a traves de anotaciones a traves del uso de etiquetas xml . Esta solución aporta un enfoque “diferente” ya que las clases java no hará falta anotarlas y quedarán mucho mas limpias .
Ahora bien para mapear correctamente el fichero orm.xml .Este debe estar ubicado en el classpath y ser referenciado desde el persistence.xml a traves de la etiqueta <mapping-file></mapping-file>
&amp;lt;persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"&amp;gt; &amp;lt; persistence-unit name="UnidadPersonas"&amp;gt; &amp;lt; mapping-file&amp;gt; orm.xml&amp;lt; /mapping-file&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;property name= "hibernate.show_sql" value="true" /&amp;gt; &amp;lt;property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /&amp;gt; &amp;lt;property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /&amp;gt; &amp;lt;property name="javax.persistence.jdbc.user" value="root" /&amp;gt; &amp;lt;property name="javax.persistence.jdbc.password" value="jboss" /&amp;gt; &amp;lt;property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/jpa" /&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;/persistence-unit&amp;gt; &amp;lt;/persistence&amp;gt;
Vamos a ver el código fuente de la clase Persona para ver como queda en el caso de que nos apoyemos en el fichero orm.xml
package com.arquitecturajava; public class Persona { private String nombre; private int edad; public Persona() { super(); } public Persona(String nombre, int edad) { super(); setEdad(edad); setNombre(nombre); } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public int getEdad() { return edad; } public void setEdad(int edad) { this.edad = edad; } }
Podemos ver que ya no necesita de ningún tipo de anotación y se convierte en un objeto de negocio clásico . Creada la clase es momento de ver como la podríamos usar en un programa habitual de JPA que realice una inserción a traves del método persist.
package com.arquitecturajava; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; public class Principal01Add { public static void main(String[] args) { Persona yo = new Persona(&amp;amp;quot;pedro&amp;amp;quot;,25); EntityManagerFactory emf = Persistence.createEntityManagerFactory(&amp;amp;quot;UnidadPersonas&amp;amp;quot;); EntityManager em = emf.createEntityManager(); try { em.getTransaction().begin(); em.persist(yo); em.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); }finally { em.close(); } } }
El objeto persistirá en la base de datos sin problemas
Hemos terminado de construir un ejemplo de JPA que se apoya en el fichero orm.xml para realizar todos los mareos. Normalmente suele ser mas cómodo usar anotaciones sin embargo si necesitamos una gran flexibilidad en el desarrollo de nuestras aplicaciones es una buena idea utilizar el fichero orm.xml para ello.
Descargar :cursoJpa01ORM
[…] artículos relacionados : ORM.XML , Introducción a JPA , JPA […]
[…] artículos relacionados: JPA orm.xml , JPA Named Queries , JPA MongoDB ,Oracle […]
[…] Otros artículos relacionados : Introducción a JPA , JPA y ORM.xml […]
Disculpa por el “Me has gustado” error de impresión jajajajja “Me han gustado”
Gracias.
a mi con el telefono movil me pasa mucho 😉
Hola Cecilio,
Me has gustado y me han servido mucho tus aportes, pero tengo una duda;
Es posible dejar los named query en el orm.xml para accederlos desde los daos? como si fuera un archivo de propiedades.
Espero me puedas ayudar.
Gracias
https://community.oracle.com/thread/657154?start=0&tstart=0 algo así?
Hola Cecilio,
Me han parecido muy interesantes y útiles los temas que tratas en el blog, no se si me puedas ayudar con un tema:
Es posible tener los named querys en el orm.xml y no como anotación en las entidades JPA?
Muchas Gracias por tus aportes.
[…] artículos relacionados: Flexibilidad en JPA ,EntityManager y […]
gracias!
de nada 🙂
Hola, ¿puede ser que falte el contenido del archvio orm.xml?
Si tiene un problema no se que ha pasado he intentado restaurarla pero nada
Creo que he conseguido solventarlo 🙂
Hola Cecilio.
El enlace al código fuente que usas está roto. Sería posible volverlo a poner operativo??
Gracias.
Buen tuto!!
no 🙁 no se donde puse el código
Hola Cecilio, primeramente felicitarte por los tutoriales que subis que son de gran ayuda para nosotros que empezamos con JPA.
Te queria pedir si se puede subir algo de ” javax.persistence.metamodel.StaticMetamodel “.
gracias desde ya!!
gracias por la felicitación lo daré una vuelta pero ahora tengo ya varios temas pendientes 🙂
Hola Cecilio: Como siempre super interesante tu Blog. Hace poco tuve que hacer una app usando JPA y Guice y si bien lo hice con anotaciones, me surgio una duda cuando usas el orm.xml: que pasa si cambias orm.xml por Persona.xml ? Persona.xml Y donde iria , tambien en el META-INF ? y si por ejemplo aparece otra clase , asumamos Rol , agregar , como se hace en el caso de anotations, agregar el tag xml Rol.xml Y a proposito, como seria el mapping, usando xml , si rol fuera atributo de Persona entre distintos archivos/clases ? Entiendo que… Read more »
Los ficheros de orm.xml también pueden ser varios .Este link te explica como http://webdev.apl.jhu.edu/~jcs/ejava-javaee/coursedocs/605-784-site/docs/content/html/hibernate-migration-orm.html. De esta forma quedaría como hibernate