Полагаю, можно получить «ложное» заключение о том, что Hibernate использует интернирование объектов при использовании Linq.Поскольку это тоже работает (то есть создает строки):
foreach (var c in s.Query<Country>())
{
Console.WriteLine("\n{0}'s people", c.CountryName);
// different memory copy
var cx = new Country { CountryId = 1 };
foreach(var p in s.Query<Person>().Where(x => x.Country == cx) )
Console.WriteLine("{0}", p.PersonName);
}
Поставщик Linq-to-db в NHibernate не заботится о других полях сущности при сравнении объектов (на самом деле, вещи сравниваются в DB-уровень, а не объекты), он сравнивает только идентификатор.Таким образом, Linq-to-db приведенного выше кода, он просто переводит вещи в: WHERE CountryId = 1.
Принимая во внимание, что если мы с нетерпением извлекаем объекты в память, мыможет вывести поведение легче.Это не приводит к появлению строк, даже если мы копируем все свойства, так как cx указывает на другой адрес.Итак, этот Linq-в-памяти не производит никаких строк:
foreach (var c in s.Query<Country>())
{
Console.WriteLine("\n{0}'s people", c.CountryName);
var cx = new Country
{
CountryId = c.CountryId,
CountryName = c.CountryName,
People = c.People.ToArray().ToList(),
Population = c.Population
};
foreach(var p in s.Query<Person>().Fetch(x => x.Country)
.ToList().Where(x => x.Country == cx) )
{
Console.WriteLine("{0}", p.PersonName);
}
}
Вот еще один Linq-в-памяти код, на этот раз он производит строки,следовательно, мы можем заключить, что интернированные объекты NHibernate.
var china = s.Get<Country>(1);
china.Population = 777;
foreach (var c in s.Query<Country>())
{
Console.WriteLine("\n{0}'s people", c.CountryName);
foreach(var p in s.Query<Person>().Fetch(x => x.Country)
.ToList().Where(x => x.Country == china) )
{
Console.WriteLine("{0} {1}", p.PersonName, p.Country.Population);
}
}
Помимо приведенного выше кода, создает строки, еще одно доказательство того, что Китай страны имеет ту же ячейку памяти, что и Country's Person: Person.Country.Population, также выводит 777.
Итак, я могу заключить, что NHibernate также использует интернирование объектов (в плане реализации, я думаю, что NH реализует вещи эффективно, ему не нужно сравнивать все свойства, когда он решает интернировать объекты, он может использоватьID как механизм, что думаете? : -) )