NHibernate: une classe de base, plusieurs mappages

Je suis relativement nouveau chez NHibernate, mais je l’utilise depuis les derniers programmes et je suis amoureux. Je suis arrivé à une situation où j’ai besoin d’agréger les données de 4-5 bases de données dans une firebase database unique. Plus précisément, il s’agit de données de numéro de série. Chaque firebase database aura son propre fichier de mappage, mais en fin de compte, les entités partagent la même structure de base (classe série).

Je comprends que NHibernate souhaite un mappage par classe. Je pensais donc initialement avoir une classe série de base, puis en hériter pour chaque firebase database différente et créer un fichier de mappage unique (la classe héritée n’aurait aucun contenu). Cela devrait fonctionner très bien pour récupérer toutes les données et remplir les objects. Ce que je voudrais ensuite faire, c’est sauvegarder ces classes héritées (vous ne savez pas quel est le terme approprié) dans la table de classes de base à l’aide du mappage de classes de base.

Le problème est que je ne sais pas comment forcer NHIbernate à utiliser un fichier de mappage spécifique pour un object. La conversion de la classe héritée en classe de base ne fait rien lorsque vous utilisez ‘session.save ()’ (il ne se plaint d’aucun mappage).

Existe-t-il un moyen de spécifier explicitement quel mappage utiliser? Ou y a-t-il juste un principal POO qui me manque pour convertir plus spécifiquement une classe héritée en classe de base? Ou est-ce une mauvaise idée?

Toutes les informations relatives à l’inheritance que j’ai pu trouver concernant NHibernate (chapitre 8) ne semblent pas totalement applicables à cette fonction, mais je peux me tromper (l’aspect tableau-par-béton-classe peut être utile, mais je peux ” Je ne comprends vraiment pas comment NHibernate détermine ce qu’il faut faire).

Je ne sais pas si cela aidera, mais je n’essayerais pas de le faire, fondamentalement.

Essentiellement, je pense que vous souffrez peut-être du syndrome de “golder hammer”: lorsque vous avez un marteau VRAIMENT VRAIMENT beau (c.-à-d. Hibernate (et je partage votre opinion à ce sujet; c’est un outil MAGNIFIQUE)), tout ressemble à un clou.

J’essayais généralement d’avoir simplement une classe de “conversion manuelle”, c’est-à-dire une qui a des constructeurs qui prennent les classes d’hibernation pour vos classes de séries individuelles et qui copient simplement les données dans leur propre format spécifique; Hibernate peut alors simplement le sérialiser sur la firebase database (unique) en utilisant son propre mapping.

En réalité, la meilleure solution, à mon avis, est que ce que vous essayez de faire est de mettre en place une sérialisation asymésortingque dans votre classe. En d’autres termes, lisez à partir d’une firebase database de votre classe dérivée, écrivez dans une autre firebase database de votre classe de base. Rien de trop horrible à ce sujet, vraiment, sauf que c’est fondamentalement un processus unidirectionnel; si vous voulez vraiment convertir une firebase database vers une autre, faites simplement la conversion et terminez-la.

Cela pourrait aider.

Utilisation de NHibernate avec plusieurs bases de données

De l’article;

introduction

… décrit en utilisant NHibernate avec ASP.NET; il proposait des directives pour communiquer avec une firebase database unique. Mais il est parfois nécessaire de communiquer simultanément avec plusieurs bases de données. Pour que NHibernate effectue cette opération, une fabrique de sessions doit exister pour chaque firebase database avec laquelle vous communiquerez. Mais, comme c’est souvent le cas avec plusieurs bases de données, certaines d’entre elles sont rarement utilisées. Il peut donc être judicieux de ne pas créer d’usines de session tant qu’elles ne sont pas réellement nécessaires. Cet article reprend là où se trouvait l’article précédent de NHibernate with ASP.NET et décrit les détails de mise en œuvre de cette approche simple. Bien que l’article précédent se soit concentré sur ASP.NET, la suggestion ci-dessous est prise en charge à la fois dans ASP.NET et .NET.

La première chose à faire lorsque vous travaillez avec plusieurs bases de données est de configurer les communications appropriées. Créez un fichier de configuration distinct pour chaque firebase database, mettez-les tous dans un dossier de configuration central, puis faites-les référence à partir du fichier web / app.config.

Je ne suis pas sûr à 100% que cela fera ce dont j’ai besoin, mais j’ai trouvé cette recherche sur Google aujourd’hui à propos de NHibernate et de types anonymes:

http://infozerk.com/averyblog/refactoring-using-object-constructors-in-hql-with-nhibernate/

La partie intéressante (pour moi, je suis novice dans ce domaine) est le mot-clé “nouveau” dans la clause de sélection HQL. Donc, ce que je pourrais faire est de sélectionner le SerialX à partir de DatabaseX en utilisant mappingX et de le transmettre à un constructeur pour SerialY (le Serial général / base). Alors maintenant, j’ai SerialY généré à partir de mappingX / databaseX, et (avec un peu de chance) je pourrais alors session.save et NHibernate utiliseront mappingY / databaseY.

La raison pour laquelle j’aime ça, c’est simplement que deux classes avec les mêmes données ont persisté (je pense!). Il n’y a vraiment aucune différence fonctionnelle entre ceci et le retour d’une liste de SerialX, son itération, la génération de SerialY et son ajout à une nouvelle liste (la première et la meilleure réponse donnée).

Cela n’a pas l’avantage plus général de présenter des arguments utiles pour les mappages NHibernate avec inheritance, mais je pense que cela produira les effets limités que je souhaite.

Bien qu’il soit vrai que vous aurez besoin d’un fichier / d’une classe de mappage pour chacune de ces tables, rien ne vous empêche de faire en sorte que toutes ces classes implémentent une interface commune.

Vous pouvez ensuite les regrouper en une seule collection dans votre couche d’application (Ie List), où chacune de ces classes implémente List).

Si vous souhaitez effectuer des mises à jour, vous devrez probablement rédiger des éléments de plomberie pour savoir dans quelle session les stocker (car vous ciblez plusieurs bases de données). Mais le processus à suivre varie en fonction de la manière dont les choses sont configurées.

J’ai écrit un très long post avec du code et tout pour répondre à Dan. Je pense que j’ai raté l’évidence.

public class Serial { public ssortingng SerialNumber {get; set;} public ssortingng ItemNumber {get; set;} public ssortingng OrderNumber {get; set;} } 

 Serial serial = sessionX.get(typeof(Serial), someID); sessionY.save(serial); 

NHibernate doit utiliser mappingX pour get et mappingY pour la sauvegarde, car les sessions ne sont pas partagées et le mappage est lié à la session. Je peux donc avoir 2 mappages pointant vers la même classe car dans une session donnée, il n’y a qu’un seul mappage sur la relation de classe.

Au moins, je pense que c’est le cas (ne peut pas tester atm).

Malheureusement, ce cas spécifique est vraiment ennuyeux et inutile. Dans un programme différent du même domaine, je dérive de la classe de base pour une partie spécifique de la logique métier. Je ne voulais pas créer de fichier de mappage, il s’agissait simplement de faciliter une petite partie du code. Quoi qu’il en soit, je ne pouvais pas le faire fonctionner à NHibernate pour les mêmes raisons que ma première question et j’ai appliqué la méthode décrite par McWafflestix pour contourner le problème (puisqu’il s’agissait d’une mesure mineure).

Cela dit, j’ai trouvé ceci via google:

http://jira.nhibernate.org/browse/NH-662

C’est exactement la même situation, et cela semble (éventuellement) traité dans NH 2.1+? Je ne l’ai pas encore suivi.

(note: Dan, dans mon cas, je reçois de plusieurs bases de données, mais en écrivant à un seul. Votre suggestion sur l’interface m’intéresse toujours, car je pense que c’est une bonne idée pour d’autres cas. Pourriez-vous définir le mappage par rapport au Si j’essaie de sauvegarder une classe qui implémente l’interface qui n’a pas de définition de mappage, NHibernate utiliserait-il le mappage d’interface ou devrais-je déclarer des sous-classes vides dans le mappage pour chaque classe qui implémente le mappage d’interface?)