将三重连接SQL映射到非hibernate.(旧数据库与奇怪的设计)

本文关键字:数据库 hibernate 三重 连接 SQL 映射 | 更新日期: 2023-09-27 18:03:33

我正在努力将一个用powerbuilder编写的旧应用程序转换为。net应用程序。在这个过程中,我们使用一个旧数据库,并且在powerbuilder应用程序中使用的一些查询转换为非hibernate流畅映射(至少对我来说)是相当具有挑战性的。

我有以下sql来获取位的列表:

SELECT   MYSCHEME.BIT.BIT_S,
         MYSCHEME.BIT.BIT_NAME,
         MYSCHEME.BIT.BIT_TYPE,   
         MYSCHEME.BIT.BIT_SIZE,                     
         MYSCHEME.BS.BS_NAME,    
         MYSCHEME.CMS.WHOLE_S
FROM MYSCHEME.BIT join MYSCHEME.BS on ( MYSCHEME.BIT.BS_S = MYSCHEME.BS.BS_S ) 
left outer join MYSCHEME.OF on MYSCHEME.BIT.BIT_TYPE_S = MYSCHEME.OF.F_S 
left outer join MYSCHEME.CMS on MYSCHEME.OF.OF_S = MYSCHEME.CMS.PART_S
WHERE ( MYSCHEME.BS.BS_S = 25) 

我应该如何将它映射到nhibernate?我应该使用标准和连接,或者只是映射它与其他表的引用?另一个挑战是数据库中的键约束非常少,例如BIT和OF之间没有键约束,或者CMS和OF之间没有键约束。

谁有解决这个挑战的好主意?我还必须能够更新CMS.WHOLE_S.

第一个连接到BS表不是很重要,因为它只是获取"父"信息,我可以从应用程序的其他部分访问该信息。

将三重连接SQL映射到非hibernate.(旧数据库与奇怪的设计)

class Bit
{
    public virtual BS Bs { get; set; }
    public virtual int WholeS
    {
        get { return Bs.Of.CMS.WholeS; }
        set { Bs.Of.CMS.WholeS = value; }
    }
}
class BS
{
    public virtual Of Of { get; set; }
}
class Of
{
    public virtual CMS CMS { get; set; }
}
class CMS
{
    public virtual int WholeS { get; set; }
}
class BitMap : ClassMap<Bit>
{
    public BitMap()
    {
        References(bit => bit.Bs, "BS_S")
            .Not.LazyLoad();  // should take care, that all is join-loaded
    }
}
...
Bit bit = session.Get<Bit>(25);
int wholeS = bit.Bs.Of.CMS.WholeS;

奥得河

Bit bit = session.Get<Bit>(25);
int wholeS = bit.WholeS;