El mundo de NoSQL sigue avanzando y tiene sus ventajas. JPA como standard siempre se ha centrado en facilitar la persistencia de objetos contra una base de datos Entidad-Relación tipo Oracle/MySQL/SQL Server.
Sin embargo no tenemos porque limitarnos a esto ya que JPA (Java Persistence API) puede acabar utilizandose para almacenar objetos en otros tipos de Repositorios de información uno de ellos puede ser por ejemplo una colección de objetos MongoDB.
Para ello nos vamos a apoyar en Hibernate OGM (Hibernate Object Grid Mapper) .Este framework nos permite integrar de una manera bastante transparente JPA con el mundo NoSQL.
Para integrar JPA MongoDB usaremos las siguientes dependencias de Maven:
</p><br> <p>&amp;lt;dependency&amp;gt;<br><br> &amp;lt;groupId&amp;gt;org.hibernate.ogm&amp;lt;/groupId&amp;gt;<br><br> &amp;lt;artifactId&amp;gt;hibernate-ogm-mongodb&amp;lt;/artifactId&amp;gt;<br><br> &amp;lt;version&amp;gt;4.1.0.Beta8&amp;lt;/version&amp;gt;<br><br> &amp;lt;/dependency&amp;gt;<br><br> &amp;lt;dependency&amp;gt;<br><br> &amp;lt;groupId&amp;gt;org.hibernate.javax.persistence&amp;lt;/groupId&amp;gt;<br><br> &amp;lt;artifactId&amp;gt;hibernate-jpa-2.0-api&amp;lt;/artifactId&amp;gt;<br><br> &amp;lt;version&amp;gt;1.0.1.Final&amp;lt;/version&amp;gt;<br><br> &amp;lt;/dependency&amp;gt;<br><br> &amp;lt;dependency&amp;gt;<br><br> &amp;lt;groupId&amp;gt;org.jboss.spec.javax.transaction&amp;lt;/groupId&amp;gt;<br><br> &amp;lt;artifactId&amp;gt;jboss-transaction-api_1.1_spec&amp;lt;/artifactId&amp;gt;<br><br> &amp;lt;version&amp;gt;1.0.0.Final&amp;lt;/version&amp;gt;<br><br> &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;<br><br> &amp;lt;/dependency&amp;gt;<br><br> &amp;lt;dependency&amp;gt;<br><br> &amp;lt;groupId&amp;gt;org.jboss.jbossts&amp;lt;/groupId&amp;gt;<br><br> &amp;lt;artifactId&amp;gt;jbossjta&amp;lt;/artifactId&amp;gt;<br><br> &amp;lt;version&amp;gt;4.16.4.Final&amp;lt;/version&amp;gt;<br><br> &amp;lt;/dependency&amp;gt;</p><br> <p>
Una vez tenemos las dependencias definidas tendremos como siempre que configurar un fichero persistence.xml que nos permite conectar con la base de datos.
</p><br> <p>&amp;lt;persistence xmlns="http://java.sun.com/xml/ns/persistence"<br><br> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br><br> xsi:schemaLocation="http://java.sun.com/xml/ns/persistence<br><br> http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"<br><br> version="2.0"&amp;gt;<br><br> &amp;lt;persistence-unit name="UnidadOGM" transaction-type="JTA"&amp;gt;</p><br> <p>&amp;lt;provider&amp;gt;org.hibernate.ogm.jpa.HibernateOgmPersistence&amp;lt;/provider&amp;gt;<br><br> &amp;lt;class&amp;gt;com.arquitecturajava.Persona&amp;lt;/class&amp;gt;<br><br> &amp;lt;properties&amp;gt;</p><br> <p>&amp;lt;property name="hibernate.ogm.datastore.provider" value="mongodb" /&amp;gt;<br><br> &amp;lt;property name="hibernate.ogm.datastore.grid_dialect"<br><br> value="org.hibernate.ogm.datastore.mongodb.MongoDBDialect" /&amp;gt;<br><br> &amp;lt;property name="hibernate.ogm.datastore.database" value="arquitecturajava" /&amp;gt;<br><br> &amp;lt;property name="hibernate.ogm.mongodb.host" value="127.0.0.1" /&amp;gt;<br><br> &amp;lt;property name="hibernate.ogm.mongodb.port" value="27017" /&amp;gt;<br><br> &amp;lt;/properties&amp;gt;<br><br> &amp;lt;/persistence-unit&amp;gt;</p><br> <p>&amp;lt;/persistence&amp;gt;</p><br> <p>
La configuración es relativamente sencilla simplemente cambiamos el proveedor habitual a org.hibernate.ogm.jpa.HibernateOgmPersistence y configuramos el dialecto para MongoDB (MongoDBDialect). Una vez hecho esto creamos una clase Persona y un programa Principal.
</p><br> <p>package com.arquitecturajava.negocio;</p><br> <p>import javax.persistence.Entity;<br><br> import javax.persistence.Id;</p><br> <p>import org.hibernate.annotations.Type;</p><br> <p>@Entity<br><br> public class Persona {</p><br> <p>@Id<br><br> @Type(type = "objectid")<br><br> private String id;</p><br> <p>public String getId() {<br><br> return id;<br><br> }</p><br> <p>public void setId(String id) {<br><br> this.id = id;<br><br> }</p><br> <p>private String nombre;<br><br> private String apellidos;</p><br> <p>public String getApellidos() {<br><br> return apellidos;<br><br> }</p><br> <p>public void setApellidos(String apellidos) {<br><br> this.apellidos = apellidos;<br><br> }</p><br> <p>public String getNombre() {<br><br> return nombre;<br><br> }</p><br> <p>public Persona() {<br><br> super();<br><br> }</p><br> <p>public Persona(String nombre) {<br><br> super();<br><br> this.nombre = nombre;<br><br> }</p><br> <p>public void setNombre(String nombre) {<br><br> this.nombre = nombre;<br><br> }</p><br> <p>}</p><br> <p>
</p><br> <p>&amp;amp;nbsp;</p><br> <p>
</p><br> <p>package com.arquitecturajava.negocio;</p><br> <p>import java.util.List;</p><br> <p>import javax.persistence.EntityManager;<br><br> import javax.persistence.EntityManagerFactory;<br><br> import javax.persistence.Persistence;</p><br> <p>public class Principal {</p><br> <p>public static void main(String[] args) {</p><br> <p>EntityManagerFactory emf = Persistence<br><br> .createEntityManagerFactory("UnidadOGM");</p><br> <p>System.out.println(emf);<br><br> EntityManager em = emf.createEntityManager();<br><br> List&amp;lt;Persona&amp;gt; lista=em.createQuery("select p from Persona p",Persona.class).getResultList();</p><br> <p>for(Persona p :lista) {</p><br> <p>System.out.println(p.getNombre());<br><br> System.out.println(p.getApellidos());<br><br> }<br><br> em.close();</p><br> <p>}</p><br> <p>}</p><br> <p>
El código es idéntico a un código de JPA . Con la salvedad de que hemos tenido que usar una anotación especifica de Hibernate para poder mapear el típico Object Id de MongoDB.
Los datos que seleccionamos de la base de datos Mongo saldrán por pantalla.
Tenemos que estar cada día mas atentos a este proyecto de Hibernate que tiene un gran futuro y nos permitirá integrar de forma más sencilla nuestras clases Java con Repositorios de datos heterogéneos.
Otros artículos relacionados: Introducción a JPA , JPA y relaciones ,Libro de JPA
Y las relacione como se mappean (con mongoDB)?
No existen relaciones, por eso se llaman BDs no relacionales, accedes a objetos dentro de objetos.
o a referencias a otras colecciones , lo que existe es el join