从另一个表中的列引用对象

时间:2011-04-04 23:35:11

标签: nhibernate nhibernate-mapping hbm

我有以下对象模型:

class ObjectA{
    public string Description {get;set;}
}

class ObjectB{
    public string Description {get;set;}
    public ObjectA A {get;set;}
}

class ObjectC{
    public string Description {get;set;}
    public ObjectB B {get;set;}
}

class ObjectD{
    public string Description {get;set;}
    public ObjectC C {get;set;}
    public ObjectA A {get;set;}
}

我的表格如下:

A:ID(int),DESCRIPTION(字符串)

B:ID(int),DESCRIPTION(字符串),A_ID(int)

C:ID(int),DESCRIPTION(字符串),B_ID(int)

D:ID(int),DESCRIPTION(字符串),C_ID(int),A_ID(int)

在表D中,A_ID是表A主键的外键。最初这样做是为了让您可以从ObjectAObjectD轻松访问ObjectD.A。这导致表A中的ID必须以这种方式添加到想要访问ObjectA的每个表中,从而对数据库进行反规范化(假设有ObjectEObjectF所有想要轻松访问ObjectA)。在这种情况下,ObjectB将始终引用ObjectA

我想在我的所有表中删除对A_ID的引用,但我希望能够从我的类中轻松访问ObjectA。我知道我可以在需要时ObjectD.ObjectC.ObjectB.ObjectA获得ObjectA,但这似乎无法延迟加载我的对象。

如何映射我的ObjectD,以便在ObjectA的表格中没有ObjectA ID的情况下直接访问ObjectD

注意:我正在使用hbm / xml文件来映射我的课程。

1 个答案:

答案 0 :(得分:1)

在我看来,出于性能原因,您要么使用冗余数据,要么不这样做。我无法想到第三种选择。 (但有更好的NHibernate思想可以纠正这种观点)。

如果这些对象的读取比写入要高得多,并且用例在大多数情况下需要访问ObjectA,那么冗余就可以了。否则,您引用的ObjectD.C.B.A方法开始变得更具吸引力。