我想知道是否有办法在nHibernate中禁用子记录的自动加载(对于一个:许多关系).
我们可以轻松地关闭属性上的延迟加载,但我想要的是禁用任何类型的自动加载(懒惰和非懒惰).我只想通过查询加载数据(即HQL或Criteria)
我仍然希望在映射文件中定义父子记录之间的关系以促进HQL并能够加入父子实体,但我不希望子记录作为父记录的一部分加载,除非查询父记录明确指出(通过急切获取等).
示例:从数据库中获取部门记录不应从数据库中获取所有员工记录,因为可能永远不需要它.
这里的一个选项是将Department上的Employees集合设置为延迟加载.这种方法的问题在于,一旦将对象提供给调用API,它就可以"触摸"延迟加载属性,并从db中获取整个列表.
我试图使用'evict' - 断开对象,但它似乎并不总是在工作,并且不会对对象进行深度驱逐.另外,它使用代理类抽象延迟加载的属性类型,该代理类稍后在代码中播放,我们尝试通过反射对对象进行操作,并且在对象上遇到未消除的类型.
我是nHibernate的初学者,任何指针或帮助都会有很大的帮助.
根据您的请求,您可能根本无法从“部门”映射到“员工”,也无法在您的部门中拥有“员工”属性。这意味着您始终必须访问数据库才能找到数据库的员工。
如果这些代码示例不能开箱即用,我深表歉意,因为我目前还没有靠近编译器
因此,您的部门课程可能如下所示:
public class Department
{
public int Id { get; protected set; }
public string Name { get; set; }
/* Equality and GetHashCode here */
}
Run Code Online (Sandbox Code Playgroud)
你的员工看起来像:
public class Employee
{
public int Id { get; protected set; }
public Name Name { get; set; }
public Department Department { get; set; }
/* Equality and GetHashCode here */
}
Run Code Online (Sandbox Code Playgroud)
任何时候您想为某个部门寻找员工,您都必须致电:
/*...*/
session.CreateCriteria(typeof(Employee))
.Add(Restrictions.Eq("Department", department)
.List<Employee>();
Run Code Online (Sandbox Code Playgroud)
仅仅因为您的规范说“部门有许多员工”,并不意味着您必须将其映射为双向关联。如果您可以保持关联的单向性,那么您也可以真正实现数据访问。
Google “领域驱动设计”聚合,或参阅 Eric Evan 的领域驱动设计书籍第 125 页以获取更多信息
| 归档时间: |
|
| 查看次数: |
9772 次 |
| 最近记录: |