2

私は休止状態の参照を読んでいます。それらは休止状態の2つの要素です: <join><any>. それを読んだ後、リファレンスが何について話しているのかわかりません。

join/any をいつ使用すればよいかわかりません。どのようなシナリオに適していますか? <join/> の場合: "fetch" を設定する場合、hibernate はいつ内部結合を使用し、いつ外部結合を使用し、いつ select を使用しますか? どのテーブルのどの列が使用されていますか? 提供された休止状態の参照の例では、次のように述べられています。 "country"/> </join> の場合、これら 2 つのテーブルを結合するために使用される列はどれですか?

<join> に fetch を設定すると、次のように表示されました。例を教えてください: which is this class?) またはそのスーパークラス ((私の質問: 誰かが私に言う例を教えてください: which is this class?) ) によって定義された <join> の外部結合サブクラス((私の質問:誰か私に例を教えてください:このクラスはどれですか?))。select に設定されている場合、Hibernate はサブクラスで定義された <join> に対して順次選択を使用します ((私の質問: だれか例を教えてください: このクラスはどれですか?))。行は、サブクラスのインスタンスを表すことが判明しました((私の質問: 誰かが私に言う例を教えてください:このクラスはどれですか?))。内部結合は、クラスとそのスーパークラスによって定義されたを取得するために引き続き使用されます((私の質問: 誰か私に例を教えてください: このクラスはどれですか?) )。

つまり、以下のすべてのクラスを知りたい:そのスーパークラスと、サブクラスによって定義された <join> の外部結合。select に設定すると、Hibernate はサブクラスで定義された <join> に対して順次選択を使用します。これは、行がサブクラスのインスタンスを表すことが判明した場合にのみ発行されます。内部結合は、クラスとそのスーパークラスによって定義された <join> を取得するために引き続き使用されます。

<any> の場合、どのようなシナリオに適していますか?どのように機能するか説明してください。例を挙げてこれを説明してくれる人はいますか?ありがとう。

4

1 に答える 1

0
  • <join>主キー/ID で 1 対 1 の関連付けを持つ 2 つの 2+ テーブルを 1 つのクラスにマップするために使用されます

    Table A        Table B
    -------        -------
    id | name      a_id | status
    
    class Foo
    {
        private int id;
        private string name;
        private string status;
    }
    
    <class name="Foo">
      <id name="id"/>
      <property name="name"/>
      <join table="B">
        <key column="a_id"/>
        <property name="status"/>
      </join>
    </class>
    
  • <any>多態的な参照をマッピングするために使用されます。たとえば、連絡先は、所属するユーザーまたは会社を参照できます。そのため、2 つの列を使用します。1 つは Company/User の ID で、もう 1 つは "user" または "company" などの参照のタイプを格納するためのものです。利点は、すべての可能なテーブルを調べる必要なく、参照されるエンティティのタイプ (およびテーブル) を認識できることです。

    Table Users         Table Companies
    ----------          -------------
    id | name           id | trademark
    
    Table Contacts
    -----------------------
    id | text | owner_id | owner_type
    
    class User/Company implements HasContacts
    {
        private int id;
        private string name/trademark;
        private Set<Contact> contacts;
    }
    
    class Contact
    {
        private int id;
        private string text;
        private HasContacts owner;
    }
    
    <class name="Contact">
      <id name="id"/>
      <property name="name"/>
      <any name="owner" id-type="System.Int64" meta-type="System.String">
        <meta-value value="user" class="User"/>
        <meta-value value="company" class="Company"/>
        <column name="owner_id"/>
        <column name="owner_type"/>
      </any>
    </class>
    
    <class name="User">
      <id name="id"/>
      <property name="name"/>
      <set name="contacts" where="owner_type='user'">
        <key column="owner_id"/>
        <one-to-many class="Contact"/>
      </set>
    </class>
    
    <class name="Company">
      <id name="id"/>
      <property name="trademark"/>
      <set name="contacts" where="owner_type='company'">
        <key column="owner_id"/>
        <one-to-many class="Contact"/>
      </set>
    </class>
    
于 2012-11-07T07:49:09.227 に答える