dans Hibernate

LazyInitialization exception expliquée

Amis développeur bonjour!

Dans ce nouveau post, je souhaiterai partager avec vous l’explication d’une exception que bon nombre de développeur ont probablement déjà rencontré: La LazyInitializationException (org.hibernate.internal.CoreMessageLogger.LazyInitializationException)

Définition

Il s’agit d’une « unchecked exception » levée par hibernate dans certains cas particulier.

Essayons d’analyser ensemble le contexte nécessaire pour qu’une telle exception se produise.

Tout d’abord le nom de l’exception lui-même nous donne une petite indication « Lazy ».

Piqure de rappel

Une entité hibernate est une simple classe java (pojo :Plain Object Java Object) composée d’attributs qui peuvent être de type primitif ou référence.

Dans le dernier cas on parle de relation.

Imaginons une classe Car et Une classe User , nous pourrions définir la relation suivante:


@Entity

public class Car{

private Integer id;

private String marque;

// Others attributes

private User owner;

// Default constructor

public Car(){}

// Getters & Setters

}

Question:

Comment est chargée la relation owner lorsque je charge une instance de la classe Car ?

Hibernate nous propose 2 modes de chargement:

  • Eagger ou chargement implicite de la relation
  • Lazy ou chargement à la demande de la relation

Vous l’aurez deviné notre exception concerne le second cas de figure, lorsque nous définissons une relation en lazy (qui est souvent le mode de chargement recommandé) nous nous exposons potentiellement à ce type d’exception.

Afin de récupérer des objets depuis la base de donnés Hibernate utilise la notion de session, la session Hibernate permet de faire des opérations (CRUD) au sein de notre base de données. La session est l’objet Hibernante de bas niveau qui permet la communication avec la base de données. La session constitue également ce qu’on appelle le cache de 1er niveau Hibernate ou cache de niveau transactionnelle.

Les objets sont mis en session (içi comprendre mis en cache de 1er niveau )lorsqu’ils sont chargés via la methode load ou get de l’interface session ou lorsqu’il sont persistés.

Les différents états d’un objet hibernate

Rappelons les differents états d’un objet hibernate :

  • Transient
  • Persist (Managed)
  • Detached
Les etats d'un objet hibernate

Hibernate object state

Source : https://vladmihalcea.com/2014/07/30/a-beginners-guide-to-jpahibernate-entity-state-transitions/

Afin de démarrer une opération avec la base donnée nous avons donc besoin d’une session ouverte, une session s’ouvre en appelant la méthode open.

Une fois notre session ouverte il nous est alors possible de faire toutes sortes d’operations (lecture ou écriture) une fois les opérations terminées il faut refermer la session avec la méthode close de l’interface session. Heureusement pour nous certains framework comme spring gèrent le cycle de vie de la session pour nous.

Nous arrivons au cœur de notre problème, que se passe t’il lorsque nous essayons d’accéder à une relation une fois la session fermée ?? Une belle LazyInitializationException.

 

Ecrire un Commentaire

Commenter

Webmentions

  • clindamycin gel

    […] clindamycin gel[…]

    clindamycin gel