web-dev-qa-db-fra.com

Qu'est-ce qu'un proxy dans le contexte de la méthode load () d'Hibernate?

La documentation Hibernate pour la méthode load() dit:

Sachez que load () lèvera une exception irrécupérable s'il n'y a pas de ligne de base de données correspondante. Si la classe est mappée avec un proxy , load () renvoie simplement un proxy non initialisé et ne frappe pas réellement la base de données jusqu'à ce que vous appeliez une méthode du proxy . Ceci est utile si vous souhaitez créer une association à un objet sans le charger réellement depuis la base de données. Il permet également de charger plusieurs instances en tant que lot si la taille du lot est définie pour le mappage de classe.

Veuillez m'aider à comprendre cela en expliquant la signification des parties mises en évidence ci-dessus en en gras .

32
Chaitanya

Les proxys sont des classes générées dynamiquement par Hibernate pour aider au chargement paresseux. Par exemple, si vous avez une classe Cat, Hibernate générera une classe proxy qui étend Cat.

Si vous obtenez une instance non initialisée de ce proxy, pratiquement tous ses champs seront nuls à l'exception de l'ID car Hibernate n'a pas encore atteint la base de données. Maintenant, la première fois que vous appellerez une méthode sur ce proxy, il se rendra compte qu'elle n'est pas initialisée et interrogera la base de données pour charger ses attributs. Cela est possible car la classe générée dynamiquement remplace les méthodes de la classe de base et ajoute cette vérification initialisée/non initialisée.

Supposons maintenant que votre classe Cat n'est pas un proxy et qu'elle a une association father, lorsque vous chargez un objet Cat, Hibernate devra charger tous ses attributs. Donc, si vous chargez un objet Cat, Hibernate devra également charger son père et le père du père et ainsi de suite. L'utilisation de proxys permet à Hibernate de charger uniquement les instances requises.

Cat cat1 = (Cat) session.load(1);
Cat cat2 = (Cat) session.load(2);
Cat cat3 = (Cat) session.load(3);

cat1.meow(); // this will cause Hibernate to run a query to load cat1's data
cat2.meow(); // this will cause Hibernate to run a query to load cat2's data

// After this cat3 is still an uninitiated proxy because it has not been used

batch-size est une autre fonctionnalité d'Hibernate qui, dans la plupart des cas, aide à gérer le chargement paresseux. Fondamentalement, l'idée est qu'Hibernate garde une trace des proxys non initialisés et lorsque l'un des besoins doit être initialisé, une seule requête sera exécutée pour charger jusqu'àbatch-size proxies (au lieu d'un seul proxy/requête)

Cat cat1 = (Cat) session.load(1);
Cat cat2 = (Cat) session.load(2);

cat1.meow(); // if batch-size >= 2, cat1 and cat2 will be loaded in a single query
cat2.meow(); // no query will be executed here
66
Guillaume

Ceci est similaire au chargement paresseux des associations, mais peut être considéré comme davantage une "création paresseuse".

Un proxy est une sous-classe implémentée lors de l'exécution. Hibernate crée un proxy (une sous-classe de la classe récupérée) au lieu d'interroger directement la base de données, et ce proxy chargera le "vrai" objet de la base de données chaque fois qu'une de ses méthodes est appelée.

Le deuxième texte en surbrillance explique que si vous appelez load() sur plusieurs instances, vous pouvez les récupérer sous forme de lot et réduire ainsi les allers-retours dans la base de données.

C'est aussi la différence entre load () et get (), load sorte de paresseux charge l'objet, tandis que get récupère immédiatement l'objet de la base de données

11
Einar Bjerve

Les objets proxy sont des instances vides qui sont utilisées dans Lazy Loading pour initialiser les champs d'objet lorsqu'ils sont demandés à l'aide de la méthode getter. Jusque-là, l'objet est vide ne contenant que l'ID principal.

2
Mayank Kesari