Overview
En esta guía, aprenderás a usar la Extensión MongoDB para Hibernate ORM para ejecutar operaciones de crear, leer, actualizar y borrar (CRUD) en tus colecciones MongoDB.
Datos de muestra
Los ejemplos de esta guía utilizan el Movie entidad, que representa la colección sample_mflix.movies de la Conjuntos de datos de muestra del Atlas. La Movie entidad tiene la siguiente definición:
import com.mongodb.hibernate.annotations.ObjectIdGenerator; import org.bson.types.ObjectId; import java.util.List; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; public class Movie { private ObjectId id; private String title; private String plot; private int year; private List<String> cast; public Movie(String title, String plot, int year, List<String> cast) { this.title = title; this.plot = plot; this.year = year; this.cast = cast; } public Movie() { } public ObjectId getId() { return id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getPlot() { return plot; } public void setPlot(String plot) { this.plot = plot; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public List<String> getCast() { return cast; } public void setCast(List<String> cast) { this.cast = cast; } }
Para aprender a crear una aplicación Java que use la extensión MongoDB para Hibernate ORM para interactuar con esta colección de muestra de MongoDB, consulte Comenzar tutorial.
Importante
Contextos de Persistencia
Para habilitar que Hibernate ORM interactúe con la base de datos, debes ejecutar operaciones dentro de un contexto de persistencia usando un Hibernate Session o una Persistencia Jakarta EntityManager. También debes ejecutar operaciones de guardar dentro de una transacción para modificar datos de MongoDB y mantener la integridad de los datos.
Antes de ejecutar los ejemplos en esta guía, asegúrate de añadir código de contexto de persistencia y gestión de transacciones a tu aplicación que se asemeje al siguiente código:
var sf = HibernateUtil.getSessionFactory(); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); // ... Perform CRUD operations here tx.commit(); session.close(); sf.close();
Para utilizar una sesión, debes crear un archivo HibernateUtil.java que configure un SessionFactory. Para obtener más información, consulta el paso Configura tu aplicación del tutorial Comenzar.
// Replace <persistence unit> with the name of your persistence unit in the persistence.xml file EntityManagerFactory emf = Persistence.createEntityManagerFactory("<persistence unit>"); EntityManager entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); // ... Perform CRUD operations here entityManager.getTransaction().commit(); entityManager.close(); emf.close;
Para usar un EntityManager, debes crear un archivo persistence.xml que declare una unidad de persistencia. Para obtener más información, consulta el Tutorial usando APIs estándar de JPA
en la documentación de Hibernate ORM.
Insertar documentos
Crea un documento pasando una instancia de entidad a los siguientes métodos, que insertan el documento correspondiente en tu colección:
org.hibernate.Session.persist(): Utiliza la API de Hibernate para aplicar tus cambios a la base de datosjakarta.persistence.EntityManager.persist():Utilice la API de persistencia de Jakarta para aplicar sus cambios a la base de datos
Tip
Para obtener más información sobre la creación de instancias de entidades y su persistencia en la base de datos, consulta Haciendo persistentes las entidades en la guía para usuarios de Hibernate ORM.
Ejemplo
El siguiente ejemplo crea una nueva instancia de entidad Movie y utiliza el método persist() para insertar un documento correspondiente en la colección sample_mflix.movies:
var myMovie = new Movie(); myMovie.setTitle("Knives Out"); myMovie.setYear(2019); myMovie.setCast(List.of("Ana de Armas", "Daniel Craig", "Chris Evans")); myMovie.setPlot("Detective Benoit Blanc investigates the mysterious death of crime novelist Harlan Thrombey, " + "unraveling lies as every Thrombey family member becomes a suspect."); session.persist(myMovie);
var myMovie = new Movie(); myMovie.setTitle("Knives Out"); myMovie.setYear(2019); myMovie.setCast(List.of("Ana de Armas", "Daniel Craig", "Chris Evans")); myMovie.setPlot("Detective Benoit Blanc investigates the mysterious death of crime novelist Harlan Thrombey, " + "unraveling lies as every Thrombey family member becomes a suspect."); entityManager.persist(myMovie);
Lea los documentos
Para recuperar documentos de tu colección, proporciona los criterios de tu query al método createQuery(). Las siguientes APIs proporcionan el método createQuery():
API
Sessionde Hibernate: Usa la sintaxis de Hibernate Query Language (HQL) para definir tus consultasAPI
EntityManagerde Jakarta Persistence: utilice la sintaxis del lenguaje de consulta de Jakarta Persistence (JPQL), un subconjunto de HQL, para definir sus consultas
Tip
Para obtener más información sobre cómo recuperar datos mediante la sintaxis HQL y JPQL, consulte las declaraciones Select en la guía de consultas ORM de Hibernate.
Nota
Esta sección describe cómo leer documentos utilizando HQL y JPQL, pero también se puede utilizar el generador de criterios o consultas nativas para recuperar datos. Para obtener más información, consulta las siguientes guías:
Ejemplo de devolución de un documento
Para recuperar solo un documento que coincida con tus criterios de query, encadena el método getSingleResult() al método createQuery(). El siguiente ejemplo recupera un documento que tiene un valor de title de "Boyhood" de la colección sample_mflix.movies:
var singleResult = session.createQuery("from Movie where title = :t", Movie.class) .setParameter("t", "Boyhood") .getSingleResult(); System.out.println("Title: " + singleResult.getTitle() + ", Year: " + singleResult.getYear());
Title: Boyhood, Year: 2014
var singleResult = entityManager.createQuery("select m from Movie m where m.title = :t", Movie.class) .setParameter("t", "Boyhood") .getSingleResult(); System.out.println("Title: " + singleResult.getTitle() + ", Year: " + singleResult.getYear());
Title: Boyhood, Year: 2014
Tip
Query sintaxis
Para obtener más información sobre la sintaxis HQL y JPQL, consulte Una guía para el lenguaje de consulta de Hibernate en la documentación de Hibernate ORM.
Ejemplo de devolución de varios documentos
El siguiente ejemplo llama al método createQuery() en una sesión para recuperar documentos de la colección sample_mflix.movies. El código usa HQL y JPQL para devolver documentos con un valor year de 1920 e imprime sus valores title:
var results = session.createQuery("from Movie where year = :y", Movie.class) .setParameter("y", 1920) .getResultList(); results.forEach(movie -> System.out.println(movie.getTitle()));
High and Dizzy One Week The Saphead The Daughter of Dawn
var results = entityManager.createQuery("select m from Movie m where m.year = :y", Movie.class) .setParameter("y", 1920) .getResultList(); results.forEach(movie -> System.out.println(movie.getTitle()));
High and Dizzy One Week The Saphead The Daughter of Dawn
Modificar documentos
Puedes realizar las siguientes operaciones para modificar documentos en una colección:
Actualizar un documento: Llama a los métodos setter de tu entidad para cambiar los valores de los campos de una instancia de entidad y luego utiliza una sesión o un administrador de entidades para guardar tus cambios.
Actualizar documentos múltiples: Pasa una instrucción de actualizar a los métodos
createQuery()ocreateMutationQuery()en una sesión o administrador de entidades. Luego, llama al métodoexecuteUpdate()para aplicar tus cambios a la base de datos.
Tip
Para obtener más información sobre cómo modificar datos mediante Hibernate ORM, consulte los siguientes recursos:
Modificando el estado gestionado/persistente en la guía del usuario de Hibernate ORM
Instrucciones de actualización en la guía de consultas ORM de Hibernate
Actualizar un ejemplo
El siguiente ejemplo recupera un documento por su valor ObjectId. Luego, el ejemplo llama al método setTitle() de la entidad Movie para actualizar el valor title del documento a "Jurassic Park I":
// Your ObjectId value might differ Movie movieById = session.get(Movie.class, new ObjectId("573a1399f29313caabcedc5d")); movieById.setTitle("Jurassic Park I"); session.persist(movieById);
// Your ObjectId value might differ Movie movieById = entityManager.find(Movie.class, new ObjectId("573a1399f29313caabcedc5d")); movieById.setTitle("Jurassic Park I"); entityManager.persist(movieById);
Actualizar múltiples ejemplo
El siguiente ejemplo actualiza el valor de title de los documentos coincidentes de "The Three Stooges" a "The 3 Stooges". Luego, el ejemplo llama al método executeUpdate() para aplicar los cambios a la base de datos:
var updateResult = session.createMutationQuery( "update Movie set title = :new where title = :old") .setParameter("new", "The 3 Stooges") .setParameter("old", "The Three Stooges") .executeUpdate(); System.out.println("Number of movies updated: " + updateResult);
Number of movies updated: 2
var updateResult = entityManager.createQuery( "update Movie m set m.title = :new where m.title = :old") .setParameter("new", "The 3 Stooges") .setParameter("old", "The Three Stooges") .executeUpdate(); System.out.println("Number of movies updated: " + updateResult);
Number of movies updated: 2
Delete Documents
Puede realizar las siguientes operaciones para eliminar documentos de una colección:
Eliminar un documento: llame al
remove()método en una sesión o administrador de entidades, pasando la instancia de entidad que desea eliminar como argumento.Eliminar varios documentos: Pase una instrucción de eliminación a los
createQuery()createMutationQuery()métodos o de un gestor de sesiones o entidades. Luego, llame alexecuteUpdate()método para aplicar los cambios a la base de datos.
Tip
Para obtener más información sobre el borrado de datos con Hibernate ORM, consulta los siguientes recursos:
Borrando entidades en la guía del usuario de Hibernate ORM
Eliminar declaraciones en la guía de consultas ORM de Hibernate
Borrar un ejemplo
El siguiente ejemplo recupera un documento por su valor de ObjectId. Luego, el ejemplo llama al método remove() en una sesión para borrar el documento correspondiente de la colección sample_mflix.movies:
// Your ObjectId value might differ Movie movieToDelete = session.get(Movie.class, new ObjectId("573a1399f29313caabcedc5d")); session.remove(movieToDelete);
// Your ObjectId value might differ Movie movieToDelete = entityManager.find(Movie.class, new ObjectId("573a1399f29313caabcedc5d")); entityManager.remove(movieToDelete);
Borrar Múltiples ejemplos
El siguiente ejemplo elimina todos los documentos que tienen un valor year de 1920 de la colección sample_mflix.movies. El ejemplo pasa una instrucción de borrado al método createMutationQuery() y luego llama al método executeUpdate() para aplicar los cambios a la base de datos:
var deleteResult = session.createMutationQuery( "delete Movie where year = :y") .setParameter("y", 1920) .executeUpdate(); System.out.println("Number of movies deleted: " + deleteResult);
Number of movies deleted: 4
var deleteResult = entityManager.createQuery( "delete Movie m where m.year = :y") .setParameter("y", 1920) .executeUpdate(); System.out.println("Number of movies deleted: " + deleteResult);
Number of movies deleted: 4
Información Adicional
Para obtener más información sobre cómo realizar operaciones CRUD utilizando Hibernate ORM, consulta los siguientes recursos:
Contexto de persistencia en la guía del usuario de Hibernate ORM
Tipos de instrucciones en la guía de query de Hibernate ORM
Para ver más ejemplos de creación, lectura, actualización y borrar, consulta las siguientes secciones del tutorial Comenzar:
Para obtener más información sobre cómo utilizar la extensión Hibernate ORM para ejecutar consultas, consulta las siguientes guías: