摘要
NHibernate提供两个方法按主键值查找对象:Load/Get。
1. Load/Get方法的区别
Load:
- Load方法可以对查询进行优化。
- Load方法实际得到一proxy对象,并不立即查询数据库。当访问对象的属性的时候才查询数据库。在NHibernate里称为Lazy Loding(延迟加载)。
- Load方法得到的对象,如果对象不存在,在访问对象的属性时将抛出异常。
- 当需要得到实体对象,但是不需要访问对象属性的时候,宜使用Load方法。比如Delete方法:
private static void Delete(int id)
{
using (var session = SessionFactory.OpenSession())
{
var customer = session.Load<Customer>(id);
session.Delete(customer);
session.Flush();
}
}
Get:
- Get方法立即查询数据库,如果对象不存在,返回null。
2. 程序演示
修改SessionFactory属性,添加cfg.DataBaseIntegration,让控制台输出执行的SQL语句。
public static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
var cfg = new Configuration();
cfg.DataBaseIntegration(x=> {
x.LogSqlInConsole = true;
});
cfg.Configure();
_sessionFactory = cfg.BuildSessionFactory();
}
return _sessionFactory;
}
}
修改Main函数
static void Main(string[] args)
{
HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize(); using (var session = SessionFactory.OpenSession())
{
var customerExist = session.Get<Customer>();
var customerNotExist = session.Get<Customer>();
Console.WriteLine("customer id = 1");
Console.WriteLine(customerExist != null ? "existed" : "not existed");
Console.WriteLine("customer id = 5");
Console.WriteLine(customerNotExist != null ? "existed" : "not existed");
} using (var session = SessionFactory.OpenSession())
{
var customerExist = session.Load<Customer>();
Console.WriteLine("load customer id = 1");
string lastName = customerExist.LastName;
try
{
var customerNotExist = session.Load<Customer>();
lastName = customerNotExist.LastName;
}
catch (HibernateException e)
{
throw e;
}
} Console.WriteLine("Completed");
Console.ReadLine();
}
执行程序,得到结果
load customer id = 1的输出是在查询语句前输出的,说明了Load方法在访问查询结果对象的属性时才去访问数据库。
Load不存在的对象,访问对象属性时抛出异常。