【问题标题】:NHibernate one-to-one mapping, non-primary keysNHibernate 一对一映射,非主键
【发布时间】:2011-04-21 21:20:29
【问题描述】:

无法让 NHibernate 生成正确的查询。它一直使用我为一对一关系加入的两个表的主键,我不知道如何在其中一个表中指定外键。

tableA      tableB
{ aID,      { bID,
  bID,        z,
  c,          y,
  d }         x }

所以 tableA 应该使用 tableA.bID = tableB.bID 加入 tableB。如何在 tableA 的映射中指定这个?我正在使用 tableA 类从 tableA 中检索一行,从 tableB 中检索一行,因为它是真正的一对一关系。

NHibernate 使用 tableA.aID = tableB.bID 生成连接表的 sql,这是错误的。

这不起作用:

<class name="tableA" table="tableA">
  <id name="aID" column="aID" />
  <property name="bID" column="bID" />
  <property name="c" column="c" />
  <property name="d" column="d" />
  <one-to-one name="otherThing" class="tableB" foreign-key="bID" />
</class>

<class name="tableB" table="tableB">
  <id name="bID" column="bID" />
  <property name="z" column="z" />
  <property name="y" column="y" />
  <property name="x" column="x" />
</class>

【问题讨论】:

    标签: nhibernate mapping key one-to-one


    【解决方案1】:

    这是映射它的正确方法:

    <class name="tableA" table="tableA">
      ...
      <many-to-one name="otherThing" class="tableB" column="bID" unique="true" />
    </class>
    
    • 我假设这真的是一对一的,因此unique
    • 您应该将每一列映射一次。如果是关系,则不是 int 属性。

    从 tableB 到 tableA 的引用将被实现为:

    <class name="tableB" table="tableB">
      ...
      <one-to-one name="A" class="tableA" property-ref="otherThing" />
    </class>
    

    这一切都记录在http://nhibernate.info/doc/nh/en/index.html#mapping-declaration-onetoone

    【讨论】:

    • 谢谢。那行得通。令人困惑的是,当它实际上是一对一映射时,我必须使用多对一元素。我还将获取类型设置为“加入”,以减少查询次数。
    • 但是,如果你能展示一个双向的例子,那将是有教育意义的。
    【解决方案2】:

    当您还为相同的值定义一对一关系时,您不需要将属性指定为映射文件中的属性。我没有使用一对一,所以可能还有另一个问题,但我会删除该行:

    <property name="bID" column="bID" /> 
    

    从 tableA 看是否有帮助。

    【讨论】:

    • 没有影响,我也不知道为什么会这样。两个表都有该列,并且两个映射拥有这些属性应该没有问题。
    • 值得一试。我发现这样的东西有一些奇怪的副作用,所以我想我会把它扔在那里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多