首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mybatis 3中集合映射和关联映射的区别

问mybatis 3中集合映射和关联映射的区别
EN

Stack Overflow用户
提问于 2012-09-14 21:16:41
回答 1查看 23.9K关注 0票数 15

我正在从mybatis3执行mysql查询。我对此还不熟悉。mybatis 3中的集合映射和关联映射有什么不同?

下面是具体的例子。

代码语言:javascript
复制
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; 

我需要员工和项目的所有细节。

我给出的结果映射如下。

代码语言:javascript
复制
<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>

有人能用我的例子或你自己的例子来解释其中的区别吗?

我对此感到困惑..

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-16 22:32:19

我将假设您在项目和员工之间具有多对多关系,这就是您创建项目分配表的原因。这个项目分配表/对象可能只有两个字段/列:项目id到雇员id的映射-一个经典的“桥接表”(也称为“连接”或“连接”表)。

将此模型映射到对象图时,有三个选项:

  1. 项目对象可以具有分配给它的所有员工的列表
  2. 员工对象可以具有分配给

的项目列表

  1. 创建项目分配对象,该对象具有每个项目到其员工以及每个员工到其项目的映射。

在您的示例中,您选择了最后一个选项。

协会

关联是“有一对一”关系的单一映射。

假设一名员工一次只能分配给一个项目。一些模型称这种关系为“有一”或“属于”关系。如果你想让Employee成为你在对象图中的“主要”焦点,那么你可以把它与他/她的项目关联起来:

代码语言:javascript
复制
<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>

在这种情况下,您的对象将如下所示:

代码语言:javascript
复制
public Employee {
  int id;
  String firstName;
  String lastName
  Project assignedProject;
}

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

集合

集合是关联的“列表”或“集合”。

现在建立反向模型-我们将Project作为主要关注点。一个项目与Employee有一个“有多个”的关系,所以它会有一个列表或集合,所以我们使用一个“集合”映射:

代码语言:javascript
复制
<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>

现在,您的对象将如下所示:

代码语言:javascript
复制
public Employee {
  int id;
  String firstName;
  String lastName
}

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

项目关联

要创建项目关联对象,您需要:

  1. 将所有项目映射到员工以及将所有项目映射到员工的单个项目关联对象
  2. 每个项目一个项目关联对象,将项目映射到每个员工的项目关联对象,将员工映射到他/她的projects

第一种选择相当复杂和混乱--您将尝试使用对象图(最有可能是哈希表)进行关系映射。

我会选择将其中一个实体(Project或Employee)作为主要关注点,然后按照上面的说明对其进行建模。我没有介绍的一种情况是,如果Employee是您的主要关注点,并且一个员工可以在多个项目中工作,那么使用collection而不是我上面使用的association将其设置为“多个”关系。

结束语:如果查看使用"has-one“association和”has- it“collection的示例会有帮助,请参阅我创建的MyBatis Koans:https://github.com/midpeter444/mybatis-koans。Koans 10和11证明了这一点。

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12425384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档