我将假设您在项目和员工之间存在多对多关系,这就是您创建项目分配表的原因。此项目分配表/对象可能只有两个字段/列:项目 ID 到员工 ID 的映射 - 经典的“桥接表”(又名“连接”或“连接”表)。
当您将此模型映射到对象图时,您有三个选项:
- 一个 Project 对象可以有一个分配给它的所有员工的列表
- 一个 Employee 对象可以有一个他/她被分配到的项目列表
- 创建一个项目分配对象,该对象具有每个项目到其员工的映射以及每个员工到他/她的项目的映射。
在您的示例中,您选择了最后一个选项。
协会
关联是“有一个”关系的单个映射。
假设员工一次只能分配到一个项目。一些模型将此称为“拥有”或“属于”关系。如果您想让 Employee 成为对象图中的“主要”焦点,那么您可以将其与他/她的项目关联映射:
<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 与 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;
}
项目协会
要拥有 Project Association 对象,您需要:
- 将所有项目映射到员工的单个项目关联对象,反之亦然
- 每个项目一个项目关联对象,将项目映射到其员工
- 每个员工一个项目关联对象,将员工映射到他/她的项目
第一个选项相当复杂和混乱 - 您将尝试使用对象图(最有可能是哈希表)进行关系映射。
我会选择将其中一个实体(项目或员工)作为主要关注点,然后如上所示对其进行建模。我没有涵盖的一个案例是,如果员工是您的主要关注点,并且员工可以参与多个项目,那么使用 acollection
而不是association
我上面使用的关系来建立“多多”关系。
最后说明:如果查看使用“has-one”association
和“has-many”的示例会有所帮助,请collection
参阅我创建的 MyBatis Koans:https ://github.com/midpeter444/mybatis-koans 。Koans 10 和 11 证明了这一点。