10

我想知道是否有一种方法可以禁用 nHibernate 中子记录的自动加载(对于一个:多个关系)。

我们可以轻松地关闭属性的延迟加载,但我想要的是禁用任何类型的自动加载(延迟和非延迟)。我只想通过查询加载数据(即 HQL 或 Criteria )

我仍然想在映射文件中定义父子记录之间的关系以方便 HQL 并能够加入父子实体,但我不希望子记录作为父记录的一部分加载,除非在父记录明确指出(通过急切获取等)。

示例:从数据库中获取部门记录不应从数据库中获取所有员工记录,因为它可能永远不需要。

此处的一种选择是将部门上的员工集合设置为延迟加载。这种方法的问题在于,一旦将对象提供给调用 API,它就可以“触摸”延迟加载属性,并且将从数据库中获取整个列表。

我尝试使用 'evict' - 断开对象,但它似乎并没有一直工作,也没有对对象进行深度驱逐。另外,它使用代理类抽象了延迟加载的属性类型,该代理类稍后会在我们试图通过反射对对象进行操作的代码中造成严重破坏,并且它会在对象上遇到未扩展的类型。

我是 nHibernate 的初学者,任何指示或帮助都会有很大帮助。

4

2 回答 2

3

根据您的要求,您不能简单地从部门映射到雇员,也不能在您的部门中拥有雇员属性。这意味着您总是必须进行数据库访问才能找到数据库的员工。

如果这些代码示例不能开箱即用,我很抱歉,我目前不在编译器附近

因此,您的部门班级可能如下所示:

 public class Department 
 { 
     public int Id { get; protected set; }
     public string Name { get; set; }
     /* Equality and GetHashCode here */
 }

你的员工看起来像:

 public class Employee
 { 
     public int Id { get; protected set; }
     public Name Name { get; set; }
     public Department Department { get; set; }
     /* Equality and GetHashCode here */
 }

任何时候您想为某个部门寻找员工,您都必须致电:

/*...*/
session.CreateCriteria(typeof(Employee))
    .Add(Restrictions.Eq("Department", department)
    .List<Employee>();

仅仅因为您的规范说“部门有很多员工”,并不意味着您必须将其映射为双向关联。如果您可以保持关联的单向,那么您真的可以让您的数据访问也飞起来。

谷歌“领域驱动设计”聚合,或查看 Eric Evan 的领域驱动设计书的第 125 页了解更多信息

于 2008-10-23T13:24:55.683 回答
-1

您可以在集合上具有惰性属性。在您的示例中,部门有 n 名员工,如果启用了惰性,则在您加载部门时默认不会加载员工:http ://www.nhforge.org/doc/nh/en/#collections-lazy

您可以有将部门和员工明确加载在一起的查询。这是“获取”选项:http ://www.nhforge.org/doc/nh/en/#performance-fetching-lazy

于 2008-10-20T08:52:50.430 回答