web-dev-qa-db-ja.com

mybatis3のコレクションとアソシエーションマッピングの違い

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>

誰かが私の例またはあなた自身の例をとって違いを説明できますか?

私はこれと混同しています。

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

15
user533

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

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

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

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


協会

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

従業員は一度に1つのプロジェクトにしか割り当てることができないと仮定します。一部のモデルでは、これを「has-one」または「belongsto」関係と呼んでいます。従業員をオブジェクトグラフの「プライマリ」フォーカスにしたい場合は、それを彼/彼女のプロジェクトに関連付けてマップします。

<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を主な焦点にします。プロジェクトは従業員と「多くの」関係を持っているため、それらのリストまたはコレクションが含まれるため、「コレクション」マッピングを使用します。

<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. すべてのプロジェクトを従業員に、またはその逆にマップする単一のProjectAssociationオブジェクト
  2. プロジェクトごとに1つのプロジェクトアソシエーションオブジェクト。プロジェクトをその従業員にマッピングします。
  3. 従業員ごとに1つのプロジェクトアソシエーションオブジェクト。従業員を自分のプロジェクトにマッピングします。

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

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

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

23
quux00