Proxy d’Hibernate

C’est un mécanisme particulier d’Hibernate qui nous permet de ne récupérer que seulement la référence à une entity qui est persistée en base. En effet, Hibernate ne va pas charger entièrement l’entity tant que on n’accède pas aux attributs ce cette entity.
Techniquement c’est la méthode entityManager.getReference(className.class, classID) qui nous permet de récupérer cette rérérence(proxy) et qui nous permettrait par la suite de charger notre entity à la demande.

Exemple de test

// Repository
public Movie getReference(Long id) {
    return entityManager.getReference(Movie.class, id);
}Langage du code : PHP (php)

@Autowired
private MovieRepository mr;


@Test
public void getReferenceTest() {
  Movie movie = mr.getReference(1L);
  assertThat(movie.getId()).as("La référence n'a pas été correctement chargée").isEqualTo(1L);
}

// Ce test passe, et on constate en effet que Hibernate n'a exécuté aucune requete sql 
// et pourtant à un moment donné de la session, on a bien l'entity Movie qui a bien existée mais qu'à travers un proxy 
// et donc elle n'est pas entièrement chargée.

// De plus dans notre test, si on essaie d'accéder à un des attributs de movie comme movie.getName(), 
// Hibernate va nous lever un exception LazyInitializationException car on n'est pas dans une session !!!Langage du code : PHP (php)
La méthode getReference() nous renvoit bien un proxy et non un Movie

Dans le test suivant, on veut accéder à l’entité entièrement, on va alors se débrouiller pour qu’on soit dans une session et accéder à un de ces attributs.
Pour ce faire, on va travailler en mode transactionnel, ce qui va nous permettre d’ouvrir une session

// Repository

@Transactionnal // Permet d'ouvrir une session
public Movie getReference(Long id) {
    Movie movie = entityManager.getReference(Movie.class, id); // Le proxy demande une référence du movie présente en base via son id
    LOGGER.trace("Movie name: " + movie.getName()); // Et on récupère le nom de ce movie
    return movie;
}


@Test
public void getReferenceTest() {
  Movie movie = entityManager.getReference(Movie.class, 1L);
}Langage du code : JavaScript (javascript)

Leave a Comment