15

mybatis3 から mysql クエリを実行しています。私はこれが初めてです。mybatis 3 のコレクション マッピングとアソシエーション マッピングの違いは何ですか?

以下具体例。

SELECT e.empid AS empid,e.empname AS empname,
       e.empsalary AS empsalary,p.proname AS proname,p.proid AS proid 
FROM projects p,employees e,projectassigns pa 
WHERE pa.empid=e.empid AND pa.proid=p.proid; 

従業員とプロジェクトのすべての詳細が必要です。

次のように結果マップを与えました。

<resultMap id="resultProjects" type="com.pratap.model.ProjAssigns"> 
  <association property="employee" javaType="com.pratap.model.Employee"
               resultMap="resultEmployees" />
  <association property="project" javaType="com.pratap.model.Project"     
               resultMap="resultProjects" />  
</resultMap>

私の例とあなた自身の例の違いを説明できる人はいますか?

私はこれと混乱しています..

ありがとうございました。

4

1 に答える 1

28

プロジェクトと従業員の間に多対多の関係があると仮定します。これが、Project Assignment テーブルを作成した理由です。このプロジェクト割り当てテーブル/オブジェクトは、2 つのフィールド/列のみを持つことができます: プロジェクト ID から従業員 ID へのマッピング - 従来の「ブリッジ テーブル」(別名「結合」または「ジャンクション」テーブル)。

このモデルをオブジェクト グラフにマップする場合、次の 3 つのオプションがあります。

  1. Project オブジェクトには、割り当てられたすべての従業員のリストを含めることができます
  2. Employee オブジェクトは、割り当てられているプロジェクトのリストを持つことができます
  3. 各プロジェクトをその従業員に、各従業員を自分のプロジェクトにマッピングする Project Assignment オブジェクトを作成します。

あなたの例では、最後のオプションを選択しました。


協会

アソシエーションは、「has-one」関係の単一のマッピングです。

従業員は、一度に 1 つのプロジェクトにのみ割り当てることができるとします。一部のモデルでは、これを「has-one」または「belongs to」関係と呼んでいます。オブジェクト グラフで従業員を「主要な」フォーカスにしたい場合は、従業員のプロジェクトへの関連付けを使用してマップします。

<resultMap id="employeeResultMap" type="Employee">
  <constructor>
    <idArg column="employee_id" javaType="_integer"/>
  </constructor>
  <result property="firstName"  column="first_name"/>
  <result property="lastName" column="last_name"/>
  <!-- etc. for other simple properties of Employee -->

  <!-- Project is a "complex property" of Employee, so we use an -->
  <!-- association to grab all of the Projects properties also -->
  <association property="assignedProject" resultMap="projectResultMap"/>
</resultMap>

この場合、オブジェクトは次のようになります。

public Employee {
  int id;
  String firstName;
  String lastName
  Project assignedProject;
}

public Project {
  int id;
  String name;
  String abc;
}


コレクション

コレクションは、関連付けの「リスト」または「セット」です。

次に、逆のモデルを作成します。Project を主な焦点にします。Project は Employee と "has-many" 関係を持っているため、それらのリストまたはコレクションを持つことになるため、"collection" マッピングを使用します。

<resultMap id="projectResultMap" type="Project">
  <constructor>
    <idArg column="project_id" javaType="_integer"/>
    <arg column="name" javaType="String"/>
  </constructor>
  <result property="abc" column="abc"/>

  <!-- This tells mybatis that there can be multiple Employees -->
  <!-- to look up and get their properties -->
  <collection property="employees" ofType="Employee">
    <constructor>
      <idArg column="employee_id" javaType="_integer"/>
    </constructor>
    <result property="firstName"  column="first_name"/>
    <result property="lastName" column="last_name"/>
  </collection>
</resultMap>

オブジェクトは次のようになります。

public Employee {
  int id;
  String firstName;
  String lastName
}

public Project {
  int id;
  String name;
  String abc;
  List<Employee> employees;
}


プロジェクト協会

プロジェクトの関連付けオブジェクトを作成するには、次のいずれかが必要です。

  1. すべてのプロジェクトを従業員に、またはその逆にマップする単一のプロジェクト関連オブジェクト
  2. プロジェクトごとに 1 つの Project Association オブジェクト。プロジェクトをその従業員にマッピングします。
  3. 従業員ごとに 1 つの Project Association オブジェクト。従業員を自分のプロジェクトにマッピングします。

最初のオプションはかなり複雑で厄介です。オブジェクト グラフ (ハッシュ テーブルが最も可能性が高い) を使用してリレーショナル マッピングを実行しようとします。

エンティティ (プロジェクトまたは従業員) の 1 つを主な焦点にし、上で示したようにモデル化することを選択します。私が取り上げなかった 1 つのケースは、従業員が主な焦点であり、従業員が複数のプロジェクトに参加できる場合であり、上記で使用したcollectionではなくを使用して、「複数の」関係を作成しassociationます。

最後の注意association: "has-one"と "has-many"の使用例を見るのに役立つ場合はcollection、私が作成した MyBatis Koans を参照してください: https://github.com/midpeter444/mybatis-koans。公案 10 と 11 はこれを示しています。

于 2012-09-16T14:32:18.743 に答える