NHibernate的:映射一个连接在连接表NHibernate

2023-09-04 06:19:26 作者:五行缺钱

我有一个观点连接3个表在一起的链条,我需要用NHibernate的映射,以取代不作任何修改到数据库中。这可能吗? 这是我认为一个简单的例子:

  SELECT tblTable1 *,tblTable2 *,tblTable3.MyProperty从tblTable1
OUTER JOIN
tblTable2 ON tblTable1.Table1Key = tblTable2.Table1Key
OUTER JOIN
tblTable3 ON tblTable2.Table2Key = tblTable3.Table2Key
 

所以basicaly我们选择tblTable1并加入tblTable2这对我的作品在NHibernate的。我的问题是tblTable3。如何加入它从连接表tblTable2的属性?

当我做这样的映射,我收到了查询,试图加入tblTable3上Table1Key出于某种原因。

 <类名=MyClass的表=tblTable1>

< ID名称=Table1Key>
  <生成器类=身份/>
< / ID>

<属性名=.../>

<连接表=tblTable2>
  <键列=Table1Key/>

  <属性名=.../>
< /加入>

<连接表=tblTable3>
  <键列=Table2Key ??? />

  <属性名=.../>
< /加入>

< /类>
 
hbm2java首页 文档和下载 Hibernate映射文件生成工具 OSCHINA 中文开源技术交流社区

解决方案

在新罕布什尔州,你不能参加联接。唯一的办法是让一个参考,它不basicly同样的事情

 <类名=MyClass的表=tblTable1>
  < ID名称=Table1Key>
    <生成器类=身份/>
  < / ID>

  <属性名=.../>

  <多到一个表=tblTable2懒惰=假>
    <键列=Table1Key/>

    <属性名=.../>
  < /多到一>
< /类>

<类名=MyClass2的表=tblTable2>

  <连接表=tblTable3>
    <键列=Table2Key/>

    <属性名=.../>
  < /加入>
< /类>

MyClass类
{
    公共虚拟MyClass2的MyClass2的{获得;组; }

    公共虚拟INT MyClass2_MyProperty
    {
        {返回MyClass2.MyProperty; }
        集合{MyClass2.MyProperty =价值; }
    }
}

类MyClass2的
{
    公共虚拟myProperty的INT {获得;组; }
}
 

编辑选项2:如果您不希望 MyClass2的也许你可以调整这一点:

 <类名=MyClass的表=tblTable2> <  - 以表2为主要表
  < ID名称=Table1Key>
    <生成器类=序列> <  - 可问题就在这里,使用序列(直接)呢?
      < PARAM NAME =sequencename> table1_id_squence< /参数> //不知道sequencename
    < /发电机>
  < / ID>

  <属性名=.../>

  <连接表=tblTable1>
    <键列=Table1Key/>

    <属性名=.../>
  < /加入>

  <连接表=tblTable3>
    <键列=Table2Key/>

    <属性名=.../>
  < /加入>
< /类>
 

I have a view joining 3 tables together in a chain that i need to replace with a NHibernate mapping without any changes to the database. Is this possible? This is a simplified example of my view:

SELECT tblTable1.*,tblTable2.*,tblTable3.MyProperty FROM tblTable1
OUTER JOIN
tblTable2 ON tblTable1.Table1Key = tblTable2.Table1Key
OUTER JOIN
tblTable3 ON tblTable2.Table2Key = tblTable3.Table2Key

so basicaly we select tblTable1 and join tblTable2 this works for me in NHibernate. My problem is tblTable3. How do i join it on a property from the joined table tblTable2?

When i do the mapping like this i get a query trying to join tblTable3 on Table1Key for some reason.

<class name="MyClass" table="tblTable1">

<id name="Table1Key">
  <generator class="identity"/>
</id>

<property name="..." />

<join table="tblTable2">
  <key column="Table1Key" />

  <property name="..." />
</join>

<join table="tblTable3">
  <key column="Table2Key???" />

  <property name="..." />
</join>

</class>

解决方案

in NH you can't join in a join. the only way is to make it a reference, which does basicly the same thing

<class name="MyClass" table="tblTable1">
  <id name="Table1Key">
    <generator class="identity"/>
  </id>

  <property name="..." />

  <many-to-one table="tblTable2" lazy="false">
    <key column="Table1Key" />

    <property name="..." />
  </many-to-one>
</class>

<class name="MyClass2" table="tblTable2">

  <join table="tblTable3">
    <key column="Table2Key" />

    <property name="..." />
  </join>
</class>

class MyClass
{
    public virtual MyClass2 MyClass2 { get; set; }

    public virtual int MyClass2_MyProperty
    {
        get { return MyClass2.MyProperty; }
        set { MyClass2.MyProperty = value; }
    }
}

class MyClass2
{
    public virtual int MyProperty { get; set; }
}

Edit Option 2: if you dont want MyClass2 Maybe you can tweak this:

<class name="MyClass" table="tblTable2">    <-- take table2 as the main table
  <id name="Table1Key">
    <generator class="sequence">  <-- can be problem here, use sequence (directly) instead?
      <param name="sequencename">table1_id_squence</param> // not sure about "sequencename"
    </generator>
  </id>

  <property name="..." />

  <join table="tblTable1">
    <key column="Table1Key" />

    <property name="..." />
  </join>

  <join table="tblTable3">
    <key column="Table2Key" />

    <property name="..." />
  </join>
</class>