プロジェクトと従業員の間に多対多の関係があると仮定します。これが、Project Assignment テーブルを作成した理由です。このプロジェクト割り当てテーブル/オブジェクトは、2 つのフィールド/列のみを持つことができます: プロジェクト ID から従業員 ID へのマッピング - 従来の「ブリッジ テーブル」(別名「結合」または「ジャンクション」テーブル)。
このモデルをオブジェクト グラフにマップする場合、次の 3 つのオプションがあります。
- Project オブジェクトには、割り当てられたすべての従業員のリストを含めることができます
- Employee オブジェクトは、割り当てられているプロジェクトのリストを持つことができます
- 各プロジェクトをその従業員に、各従業員を自分のプロジェクトにマッピングする 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 つの Project Association オブジェクト。プロジェクトをその従業員にマッピングします。
- 従業員ごとに 1 つの Project Association オブジェクト。従業員を自分のプロジェクトにマッピングします。
最初のオプションはかなり複雑で厄介です。オブジェクト グラフ (ハッシュ テーブルが最も可能性が高い) を使用してリレーショナル マッピングを実行しようとします。
エンティティ (プロジェクトまたは従業員) の 1 つを主な焦点にし、上で示したようにモデル化することを選択します。私が取り上げなかった 1 つのケースは、従業員が主な焦点であり、従業員が複数のプロジェクトに参加できる場合であり、上記で使用したcollection
ではなくを使用して、「複数の」関係を作成しassociation
ます。
最後の注意association
: "has-one"と "has-many"の使用例を見るのに役立つ場合はcollection
、私が作成した MyBatis Koans を参照してください: https://github.com/midpeter444/mybatis-koans。公案 10 と 11 はこれを示しています。