2

nHibernateプロファイラーによると、マッピングファイルに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>
4

3 に答える 3

5

ほとんどの場合、「逆」は関係の所有者を特定することです。Resultあなたの特定のケースでは、これはあなたとApplicantマッピングにあるはずです。

詳細については、このブログ投稿をご覧ください。その記事から特に関連する声明を引用/言い換えると:

ただし、「inverse」キーワード自体は十分に冗長ではありません。[ inverse] キーワードを「relationship_owner」に変更することをお勧めします。

要するに、inverse="true"これは関係の所有者であることを意味し、inverse="false"(デフォルト) はそうでないことを意味します。

于 2012-09-19T19:31:27.140 に答える
1

冬眠初心者の頃、「inverse=true」か「inverse=false」かの判断に戸惑いました。

これを理解する簡単な方法は次のとおりです。

シナリオ例: Person(one) <-> Address(many) 双方向の 1 対多の関係。(人は複数の住所を持っています。)

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()" メソッドがあります
  • Address クラスには「Person getPerson()」メソッドがあります

2 つのクラスの関係を考えると、その人が住所を持っているという考えが浮かぶかもしれません。(人→住所)ということで、人がオーナーで、住所が子供という感じです。では、アドレスは個人のものなので、アドレスは「逆=真」と考えたいと思います。しかし、それは正しくありません。

ここでは、その方法について考えてみたいと思います。クラスの代わりにテーブル構造を見てみましょう。

  • PERSON[ID、名前、...]
  • ADDRESS[id、person_id、都市、番地、...]

Address テーブルの person_id 列は、これら 2 つのテーブル間の関係情報です。したがって、Address は関係の所有者であり、Person は逆側です。「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=false) テーブルに関係情報が含まれていない場合は、逆側です。したがって、「inverse=true」が必要です。

于 2016-01-23T11:18:57.993 に答える
0

よく説明されたチュートリアルは、mkyongのWhat is “inverse”にあります。

@mynkow の状態に焦点を当て、inverse属性の値に関する挿入と更新の例をいくつか示します。

もし私があなたなら、私はそれを見てあげます。

于 2016-08-21T15:01:56.613 に答える