Comment initialiser les entités Hibernate récupérées par un appel de méthode distant?

StackOverflow https://stackoverflow.com/questions/119732

  •  02-07-2019
  •  | 
  •  

Question

Lorsque vous appelez un service distant (par exemple via RMI) pour charger une liste d'entités à partir d'une base de données à l'aide d'Hibernate, comment gérez-vous cette opération pour initialiser tous les champs et faire référence aux besoins du client?

Exemple: le client appelle une méthode distante pour charger tous les clients. Pour chaque client, le client souhaite que la référence à la liste d'articles achetés du client soit initialisée.

Je peux imaginer les solutions suivantes:

  1. Ecrivez une méthode distante pour chaque requête spéciale, qui initialise les champs obligatoires (par exemple, Hibernate.initialize ()) et renvoie les objets de domaine au client.

  2. Comme 1. mais créez des DTO

  3. Divisez la requête en plusieurs requêtes, par exemple. un pour les clients, un second pour les articles des clients et laisser le client gérer les résultats

  4. La méthode distante utilise un DetachedCriteria, créé par le client et exécuté par le serveur

  5. Développez un "Modèle de préchargement" personnalisé, c’est-à-dire un moyen pour le client de spécifier explicitement les propriétés à précharger.

Était-ce utile?

La solution

J'en ai utilisé 1 par le passé et cela a bien fonctionné.

Autres conseils

Je pense que le numéro 5 est la raison pour laquelle il y a un "chercher" clause en HQL. Pourriez-vous l'utiliser ou le problème est-il plus complexe?

Je suis chez un client qui a normalisé ses projets sur le n ° 5 et cela a très bien fonctionné. Le dernier argument d'un appel de service était une liste de toutes les propriétés à charger, séparées par des virgules, par exemple:

CustomerService.getCustomerById(id, "parent, address, address.city")

Je pense qu'ils ont utilisé la clause fetch pour cela. J'ai mis en œuvre la même idée une fois pour jpa en utilisant PropertyUtils pour déclencher le chargement paresseux.

Ce service distant ... est-ce une autre partie de la même application? si tel est le cas, il n'y a aucun problème de partage de classes et d'envoi d'instances (il en va de même pour RMI, l'utilisation de stubs).

Ensuite, il est possible d'accéder à un service Web ou à un service similaire, où les deux applications qui communiquent ne partagent aucune classe, ce qui rend les choses encore plus difficiles. Je suis sur le point de faire face à ce problème dans un proche avenir et je serai très intéressé de connaître la réponse.

Quoi qu'il en soit, mon vote est pour les DTO. Je pense qu'ils fournissent la solution la plus simple et la meilleure, le cas échéant, et aident à garder le code simple et facile à gérer.

Yuval = 8 -)

Si votre service distant existe uniquement pour fournir des données à votre client, il peut être utile de désactiver le chargement différé sur toutes les entités Hibernate.

Personnellement, cependant, je pense que les DTO sont la bonne voie à suivre. En exprimant votre interface distante en termes de DTO, vous êtes certain de disposer de tout ce dont vous avez besoin et de rien d’attendu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top