web-dev-qa-db-fra.com

Que contient l'objet proxy Hibernate?

Tout ce que j'ai pu comprendre de Google, c'est que:

  • Hibernate utilise un objet proxy pour implémenter le chargement paresseux. Lorsque nous demandons de charger l'objet à partir de la base de données et que l'objet récupéré a une référence à un autre objet concret, Hibernate renvoie un proxy au lieu de l'objet concret associé.

  • Hibernate crée un objet proxy à l'aide de l'instrumentation bytecode (fournie par javassist). Hibernate crée une sous-classe de notre classe d'entité lors de l'exécution à l'aide de la bibliothèque de génération de code et remplace l'objet réel par le proxy nouvellement créé.

Alors, que contient exactement l'objet proxy?

Contient-il un objet de référence d'objet squelette avec uniquement le champ id défini? Les autres champs seront définis lorsque nous appelons la méthode get?

L'objet Proxy contient-il l'instruction JDBC pour extraire toutes les données requises pour remplir entièrement l'objet référencé.

Y a-t-il quelque chose d'autre que je pourrais manquer?

Je ne demande pas une alimentation à la cuillère, mais si vous pouvez fournir un lien avec des informations qui seraient formidables.

Toute correction de la description ci-dessus sera également la bienvenue.

Exemple.

class Address {
   String city;
   String country;
}

class Person{
   int id;
   String name;
   Address address;
}    

Lorsque nous essayons de charger l'objet Person, Hibernate sous-classe la classe Person comme:

class ProxyPerson extends Person {
       int id;
       String name;
       Address proxyCGLIBObject;
}

et renvoyer un objet ProxyPerson. L'objet de ProxyPerson aura une valeur pour id et nom mais un proxy pour Address.

Ai-je raison?

Que puis-je attendre de l'ajout d'une méthode toString () sur l'objet proxy?

40
vineeshchauhan

Comme expliqué dans mon livre, High-Performance Java Persistence , le proxy Hibernate est utilisé pour remplacer une entité POJO réelle (Plain Old Java Object).

La classe Proxy est générée lors de l'exécution et étend la classe d'entité d'origine.

Hibernate utilise des objets proxy pour les entités afin de permettre chargement paresseux .

Lors de l'accès aux propriétés de base sur le proxy, il délègue simplement l'appel à l'entité d'origine.

Chaque List, Set, Map type dans la classe d'entité est remplacé par un PersistentList, PersistentSet, PersistentMap . Ces classes sont responsables de l'interception d'un appel vers une collection non initialisée.

Le proxy n'émet aucune instruction SQL. Il déclenche simplement un InitializeCollectionEvent , qui est géré par l'écouteur associé, qui sait quelle requête d'initialisation émettre (dépend du plan de récupération configuré).

39
Vlad Mihalcea