Guide du gestionnaire Hibernate EntityManager

Guide du gestionnaire EntityManager d'Hibernate

1. introduction

EntityManager fait partie de l'API Java Persistence. Principalement, il implémente les interfaces de programmation et les règles de cycle de vie définies par la spécification JPA 2.0.

De plus, nous pouvons accéder au contexte de persistance, en utilisant les API dansEntityManager.

Dans ce didacticiel, nous allons examiner la configuration, les types et les différentes API desEntityManager.

2. Dépendances Maven

Premièrement, nous devons inclure les dépendances d’Hibernate:


    org.hibernate
    hibernate-core
    5.4.0.Final

Nous devrons également inclure les dépendances du pilote, en fonction de la base de données que nous utilisons:


    mysql
    mysql-connector-java
    8.0.13

Les dépendanceshibernate-core etmysql-connector-java sont disponibles sur Maven Central.

3. Configuration

Maintenant, montrons lesEntityManager, en utilisant une entitéMovie qui correspond à une table MOVIE dans la base de données.

Au cours de cet article, nous utiliserons l'APIEntityManager pour travailler avec les objetsMovie de la base de données.

3.1. Définir l'entité

Commençons par créer l’entité correspondant à la table MOVIE, en utilisant l’annotation@Entity:

@Entity
@Table(name = "MOVIE")
public class Movie {

    @Id
    private Long id;

    private String movieName;

    private Integer releaseYear;

    private String language;

    // standard constructor, getters, setters
}

3.2. Le fichierpersistence.xml

Lorsque leEntityManagerFactory est créé,the persistence implementation searches for the META-INF/persistence.xml file in the classpath.

Ce fichier contient la configuration desEntityManager:


    Hibernate EntityManager Demo
    com.example.hibernate.pojo.Movie
    true
    
        
        
        
        
        
        
    

Pour expliquer, nous définissons l'unité de persistance qui spécifie la banque de données sous-jacente gérée par lesEntityManager.

De plus, nous définissons le dialecte et les autres propriétés JDBC du magasin de données sous-jacent. Hibernate est agnostique à la base de données. Based on these properties, Hibernate connects with the underlying database.

4. Conteneur et applications gérésEntityManager

Fondamentalement,there are two types of EntityManager – Container Managed and Application Managed.

Examinons de plus près chaque type.

4.1. Conteneur géréEntityManager

Ici, le conteneur injecte lesEntityManager dans nos composants d'entreprise.

En d'autres termes, le conteneur crée lesEntityManager à partir desEntityManagerFactory pour nous:

@PersistenceContext
EntityManager entityManager;

Cela signifie égalementthe container is in charge of beginning, committing, or rolling back the transaction.

4.2. Application géréeEntityManager

A l'inverse, le cycle de vie desEntityManager est géré par l'application ici.

En fait, nous allons créer manuellement lesEntityManager. De plus, nous gérerons également le cycle de vie desEntityManager que nous avons créés.

Commençons par créer lesEntityManagerFactory:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("com.example.movie_catalog");

Afin de créer unEntityManager, nous devons appeler explicitementcreateEntityManager() dans leEntityManagerFactory:

public static EntityManager getEntityManager() {
    return emf.createEntityManager();
}

5. Opérations d'entité Hibernate

L'APIEntityManager fournit une collection de méthodes. Nous pouvons interagir avec la base de données en utilisant ces méthodes.

5.1. Entités persistantes

Afin d'avoir un objet associé à l'EntityManager, nous pouvons utiliser la méthodepersist():

public void saveMovie() {
    EntityManager em = getEntityManager();

    em.getTransaction().begin();

    Movie movie = new Movie();
    movie.setId(1L);
    movie.setMovieName("The Godfather");
    movie.setReleaseYear(1972);
    movie.setLanguage("English");

    em.persist(movie);
    em.getTransaction().commit();
}

Une fois que l'objet est enregistré dans la base de données, il est dans l'étatpersistent.

5.2. Entités de chargement

Pour récupérer un objet de la base de données, nous pouvons utiliser la méthodefind().

Ici, la méthode recherche par clé primaire. En fait, la méthode attend le type de classe d'entité et la clé primaire:

public Movie getMovie(Long movieId) {
    EntityManager em = getEntityManager();
    Movie movie = em.find(Movie.class, new Long(movieId));
    em.detach(movie);
    return movie;
}

à la place de la méthodeHowever, if we just need the reference to the entity, we can use the getReference(). En effet, il renvoie un proxy à l'entité:

Movie movieRef = em.getReference(Movie.class, new Long(movieId));

5.3. Entités Détachées

Dans le cas où nous devons détacher une entité du contexte de persistance,we can use the detach() method. Nous passons l'objet à détacher comme paramètre de la méthode:

em.detach(movie);

Une fois que l'entité est détachée du contexte de persistance, elle se trouve à l'état détaché.

5.4. Entités en fusion

En pratique, de nombreuses applications nécessitent une modification d'entité sur plusieurs transactions. Par exemple, nous pouvons vouloir récupérer une entité dans une transaction pour la restituer à l'interface utilisateur. Ensuite, une autre transaction apportera les modifications apportées à l'interface utilisateur.

Nous pouvons utiliser la méthodemerge(), pour de telles situations. The merge method helps to bring in the modifications made to the detached entity, in the managed entity, if any:

public void mergeMovie() {
    EntityManager em = getEntityManager();
    Movie movie = getMovie(1L);
    em.detach(movie);
    movie.setLanguage("Italian");
    em.getTransaction().begin();
    em.merge(movie);
    em.getTransaction().commit();
}

5.5. Interrogation d'entités

De plus, nous pouvons utiliser JPQL pour interroger des entités. Nous allons appelergetResultList() pour les exécuter.

Bien sûr, nous pouvons utiliser lesgetSingleResult(), si la requête ne renvoie qu'un seul objet:

public List queryForMovies() {
    EntityManager em = getEntityManager();
    List movies = em.createQuery("SELECT movie from Movie movie where movie.language = ?1")
      .setParameter(1, "English")
      .getResultList();
    return movies;
}

5.6. Supprimer des entités

De plus,we can remove an entity from the database using the remove() method. Il est important de noter que l’objet n’est pas détaché, mais supprimé.

Ici, l'état de l'entité change de persistant à nouveau:

public void removeMovie() {
    EntityManager em = HibernateOperations.getEntityManager();
    em.getTransaction().begin();
    Movie movie = em.find(Movie.class, new Long(1L));
    em.remove(movie);
    em.getTransaction().commit();
}

6. Conclusion

Dans cet article, nous avons exploré lesEntityManager enHibernate. Nous avons examiné les types et la configuration, et nous avons découvert les différentes méthodes disponibles dans l'API pour travailler avec lespersistence context.

Comme toujours, le code utilisé dans l'article est disponibleover at Github.