在nHibernate映射文件中放置inverse =“true”的位置

时间:2012-09-19 17:58:42

标签: nhibernate nhibernate-mapping

根据nHibernate profiler,我需要在我的映射文件中添加inverse =“true”,但是,我似乎无法找到关于确切放置此属性的位置的示例。任何人都可以根据以下映射文件告诉我我需要将inverse =“true”?

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   auto-import="true"
                   namespace="LROLib.Domain"
                   assembly="LROLib">
  <class name="TestResult" table ="Test_Results" >
    <id name="Test_Result_Id" >
      <generator class="native" />
    </id>

    <many-to-one name="Test_Result" class="Result" column="Result_Id" />
    <many-to-one name="Test_Applicant" class="Applicant" column="Applicant_Id"/>

    <property name="Test_Name" />
    <property name="Value" />
    <property name="Hi_Lo_Ind" />
    <property name="Range" />
    <property name="Unit_Of_Measure" />
    <property name="Lo_Range" />
    <property name="Hi_Range" />
    <property name="Create_DateTime" update="false"/>
    <property name="Update_DateTime" />
    <property name="User_Name" />

  </class>
</hibernate-mapping>

3 个答案:

答案 0 :(得分:5)

在大多数情况下,“反向”是识别关系所有者。对于您的特定情况,这应该在您的ResultApplicant映射中。

您可以在this blog post中阅读更多内容。引用/解释该文章中特别相关的陈述:

  

然而,“反向”关键字本身并不够详细,我建议将[inverse]关键字更改为“relationship_owner”。

     

简而言之,inverse="true"表示这是关系所有者,inverse="false"(默认)表示不是。

答案 1 :(得分:1)

当我是一名休眠初学者时,我对决定“inverse = true”或“inverse = false”感到困惑。

这是一种理解它的简单方法:

示例场景: 人(一)&lt; - &gt;地址(多)         双向一对多关系。 (一个人有多个地址。)

public class Person {
  private Integer id;
  private Set<Address> addresses;

  // setter, getter
  Set<Address> getAddresses() { return addresses; }
  ....
}

public class Address {
  private Integer id;
  private Person person;

  // setter, getter
  Person getPerson() { return person; }
  .....
}

  • Person类具有“Set getAddresses()”方法
  • 地址类具有“Person getPerson()”方法

如果你考虑两个类之间的关系,它可能会给出一个人有地址的想法。 (人 - &gt;地址) 因此,感觉就像一个人是一个所有者,一个地址就是一个孩子。然后,您想要认为地址是“inverse = true”,因为地址是由人拥有的。 但是,这不正确。

在这里,我想建议一种思考方式。让我们看看表结构而不是类。

  • PERSON [id,name,...]
  • ADDRESS [id,person_id,city,street,...]

Address表中的person_id列是两个表之间的关系信息。 因此,地址是关系的所有者,而人是反面。 “inverse = true”表示“此侧是反面”,“inverse = false”表示“这不是反面。”此方是所有者关系“。

<class name="Person">
  <id name="id">...</id>
  <set name="addresses" inverse="true">
    <key column="person_id"/>
    <one-to-many class="Address"/>
  </set>
</class>


<class name="Address">
  <id name="id">...</id>
  <many-to-one name="person" class="Person" />
</class>

总之,查看表结构以区分“inverse = true”或“inverse = false”。 如果表有关系信息,那么它是所有者方。所以,它不是反面的。(inverse = false) 如果表没有关系信息,那么它就是反面。所以,它需要“inverse = true”。

答案 2 :(得分:0)

您可以通过mkyong找到一个解释良好的教程:What is “inverse”

重点介绍@mynkow所说的内容,并为您提供一些插入和更新属性值的示例。

如果我是你,我会试一试。