NHibernate - Charger / Obtenir

Dans ce chapitre, nous expliquerons le fonctionnement des fonctionnalités Load et Get et comment nous pouvons les utiliser. Ce sont deux API très similaires fournies parISession pour charger un objet par clé primaire.

  • Get - il renverra l'objet ou un nul.

  • Load - il retournera l'objet ou il lancera un ObjectNotFoundException.

Maintenant, pourquoi avons-nous ces deux API différentes?

Charge

  • C'est parce que Load peut optimiser les aller-retour de la base de données beaucoup plus efficacement.

  • Load renvoie en fait un objet proxy et n'a pas besoin d'accéder à la base de données lorsque vous émettez cet appel Load.

  • Lorsque vous accédez à ce proxy, l'objet ne se trouve pas dans la base de données, il peut lancer une exception ObjectNotFoundException à ce stade.

Avoir

  • Inversement, avec Get en raison des limitations du CLR ou Common Language Runtime et NHibernate doit aller dans la base de données immédiatement, vérifier si les objets sont là et retourner null, s'il n'est pas présent.

  • Il n'a pas l'option d'objet de retarder cette extraction, cet aller-retour vers la base de données à une date ultérieure, car il ne peut pas renvoyer un objet proxy et qui a échangé cet objet proxy contre un null, lorsque l'utilisateur y accède réellement.

Jetons un coup d'œil à un exemple simple dans lequel vous verrez comment ils sont réellement utilisés et la différence entre Get et Load. Nous continuerons avec les mêmes classes de domaineCustomers et Orders et de même les mêmes fichiers de mappage du dernier chapitre.

Dans cet exemple, nous utiliserons d'abord Get comme indiqué dans le programme suivant.

using System; 
using System.Data; 
using System.Linq; 
using System.Reflection; 

using HibernatingRhinos.Profiler.Appender.NHibernate; 
using NHibernate.Cfg; 
using NHibernate.Criterion; 
using NHibernate.Dialect; 
using NHibernate.Driver;
using NHibernate.Linq; 

namespace NHibernateDemo { 

   internal class Program { 
	
      private static void Main() { 
		
         var cfg = ConfigureNHibernate(); 
         var sessionFactory = cfg.BuildSessionFactory();
         using(var session = sessionFactory.OpenSession()) 
         
         using(var tx = session.BeginTransaction()) { 
            var id1 = Guid.Parse("4e97c816-6bce-11e1-b095-6cf049ee52be"); 
            var id2 = Guid.Parse("AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE");
				
            var customer1 = session.Get<Customer>(id1); 
            Console.WriteLine("Customer1 data"); 
            Console.WriteLine(customer1);
				
            var customer2 = session.Get<Customer>(id2); 
            Console.WriteLine("Customer2 data"); 
            Console.WriteLine(customer2); 
				
            tx.Commit(); 
         }
			
         Console.WriteLine("Press <ENTER> to exit..."); 
         Console.ReadLine(); 
      }
		
      private static Configuration ConfigureNHibernate() {
		
         NHibernateProfiler.Initialize(); 
         var cfg = new Configuration(); 
         
         cfg.DataBaseIntegration(x => { 
            x.ConnectionStringName = "default"; 
            x.Driver<SqlClientDriver>(); 
            x.Dialect<MsSql2008Dialect>(); 
            x.IsolationLevel = IsolationLevel.RepeatableRead;
            x.Timeout = 10; 
            x.BatchSize = 10; 
         }); 
         
         cfg.SessionFactory().GenerateStatistics();
         cfg.AddAssembly(Assembly.GetExecutingAssembly()); 
         return cfg; 
      } 
   } 
}

Comme vous pouvez le voir, nous avons deux GuidID, le premier est un bon ID, c'est l'ID d'un client dont nous savons qu'il se trouve dans la base de données. Alors que le deuxième ID n'est pas présent dans la base de données. Ces deux identifiants sont passés en paramètre àGet() méthode, puis le résultat est imprimé sur la console.

Lorsque le code ci-dessus est compilé et exécuté, vous verrez la sortie suivante.

Customer1 data
Laverne Hegmann (4e97c816-6bce-11e1-b095-6cf049ee52be)
   Points: 74
   HasGoldStatus: True
   MemberSince: 4/4/2009 12:00:00 AM (Utc)
   CreditRating: Neutral
   AverageRating: 0

Orders:
   Order Id: 4ea14d96-6bce-11e1-b095-6cf049ee52be
   Order Id: 4ea14d96-6bce-11e1-b096-6cf049ee52be
   Order Id: 4ea14d96-6bce-11e1-b097-6cf049ee52be
   Order Id: 4ea14d96-6bce-11e1-b098-6cf049ee52be
	
Customer2 data
Press <ENTER> to exit...

Comme vous pouvez le voir, les données Client1 sont imprimées mais les données Client2 sont vides, c'est parce que l'enregistrement Client2 n'est pas disponible dans la base de données.

Lorsque vous exécutez à nouveau votre application, nous pouvons insérer un point d'arrêt avant l'instruction de validation, puis examinons les deux clients dans la fenêtre Espion.

Comme vous pouvez le voir, les données Customer1 sont disponibles, tandis que Customer2 est nul et le type est NHibernateDemo.Customer pour les deux.

Utilisons maintenant la méthode Load au lieu de Get dans le même exemple que celui indiqué dans le code suivant.

using System; 
using System.Data; 
using System.Linq; 
using System.Reflection; 

using HibernatingRhinos.Profiler.Appender.NHibernate; 
using NHibernate.Cfg; 
using NHibernate.Criterion; 
using NHibernate.Dialect; 
using NHibernate.Driver;
using NHibernate.Linq; 

namespace NHibernateDemo { 

   internal class Program { 
	
      private static void Main() { 
		
         var cfg = ConfigureNHibernate(); 
         var sessionFactory = cfg.BuildSessionFactory();
         using(var session = sessionFactory.OpenSession()) 
         
         using(var tx = session.BeginTransaction()) { 
            var id1 = Guid.Parse("4e97c816-6bce-11e1-b095-6cf049ee52be"); 
            var id2 = Guid.Parse("AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE");
				
            var customer1 = session.Load<Customer>(id1); 
            Console.WriteLine("Customer1 data"); 
            Console.WriteLine(customer1);
				
            var customer2 = session.Load<Customer>(id2); 
            Console.WriteLine("Customer2 data"); 
            Console.WriteLine(customer2); 
				
            tx.Commit(); 
         }
			
         Console.WriteLine("Press <ENTER> to exit..."); 
         Console.ReadLine(); 
      }
		
      private static Configuration ConfigureNHibernate() { 
		
         NHibernateProfiler.Initialize(); 
         var cfg = new Configuration(); 
         
         cfg.DataBaseIntegration(x => { 
            x.ConnectionStringName = "default"; 
            x.Driver<SqlClientDriver>(); 
            x.Dialect<MsSql2008Dialect>(); 
            x.IsolationLevel = IsolationLevel.RepeatableRead; 
            x.Timeout = 10;
            x.BatchSize = 10; 
         }); 
			
         cfg.SessionFactory().GenerateStatistics();
         cfg.AddAssembly(Assembly.GetExecutingAssembly()); 
         return cfg; 
      } 
   } 
}

Maintenant, exécutons cet exemple et vous verrez que l'exception suivante est lancée comme indiqué dans la capture d'écran.

Maintenant, si vous regardez la fenêtre de surveillance, vous verrez que le type est proxy client pour les deux objets. Et vous voyez également les mêmes données pour Customer1 sur la fenêtre de la console.

Customer1 data
Laverne Hegmann (4e97c816-6bce-11e1-b095-6cf049ee52be)
   Points: 74
   HasGoldStatus: True
   MemberSince: 4/4/2009 12:00:00 AM (Utc)
   CreditRating: Neutral
   AverageRating: 0

   Orders:
      Order Id: 4ea14d96-6bce-11e1-b095-6cf049ee52be
      Order Id: 4ea14d96-6bce-11e1-b096-6cf049ee52be
      Order Id: 4ea14d96-6bce-11e1-b097-6cf049ee52be
      Order Id: 4ea14d96-6bce-11e1-b098-6cf049ee52be 
		
Customer2 data