2015-10-14 31 views
2

我在MyBatis中遇到了一个有趣的问题,它在尝试映射两个相同类型的对象集合时导致递归。MyBatis:映射多个关联/同一类型的集合时的递归

介绍。

这里是我的DB模式: simple_db_schema

我有一个简单的类用户

public class User { 
    private Long id; 
    private String login; 
    private String password; 
    private Employee employee; 
    // Constructors, setters and getters go here... 
} 

然后,我有类员工

public class Employee { 
    private Long id; 
    private String lastName; 
    private User user; 
    // Constructors, setters and getters go here... 
} 

而且项目

public class Project { 
    private Long id; 
    private String name; 
    private List<Employee> observers; 
    private List<Employee> executors; 
    // Constructors, setters and getters go here... 
} 

映射

在这里,我展示了这个模式我的映射。

UserMapping

<resultMap type="User" id="userMap"> 
    <id property="id" column="user_id"/> 
    <result property="name" column="user_login" /> 
    <result property="password" column="user_password" /> 
    <association property="employee" javaType="org.project.entity.Employee" resultMap="Employee.employeeMap"/> 
</resultMap> 

EmployeeMapping

<resultMap id="employeeMap" type="Employee"> 
    <id property="id" column="emp_id" /> 
    <result property="lastName" column="emp_last_name" /> 
    <association property="user" javaType="org.project.entity.User" resultMap="User.userMap"/> 
</resultMap> 

ProjectMapping

<resultMap type="Project" id="projectMap"> 
    <id property="id" column="project_id" /> 
    <result property="name" column="project_name" /> 
    <collection property="managers" columnPrefix="obsrv" ofType="Employee" 
       javaType="java.util.ArrayList" resultMap="employeeMap" /> 
    <collection property="executors" columnPrefix="exec" ofType="Employee" 
       javaType="java.util.ArrayList" resultMap="employeeMap" /> 
</resultMap> 

注ŧ帽子我在ProjectMapping中使用“columnPrefix”。一个是观察员,另一个是执行者。这些集合使用相同的“resultMap” - “employeeMap”。

问题。

使用这种方法我的映射不起作用。 映射没有问题用户雇员反之亦然 - 工作正常。

对数据库的查询是正确的。

我已经尝试了不同的方式来排序了这一点(我把所有的映射在一个文件,我在UserMapping去除员工协会)但仍然没有任何帮助。

我找到了一个解决方案,但这不是我正在寻找的。

一种方式是复制UserMappingEmployeeMapping并改变其ID,以及使用比它这样:

<resultMap type="Project" id="projectMap"> 
    <id property="id" column="project_id" /> 
    <result property="name" column="project_name" /> 
    <collection property="managers" columnPrefix="obsrv" ofType="Employee" 
       javaType="java.util.ArrayList" resultMap="employeeMap" /> 
    <collection property="executors" columnPrefix="exec" ofType="Employee" 
       javaType="java.util.ArrayList" resultMap="employeeMap1" /> 
</resultMap> 

这意味着我有2份UserMappingEmployeeMapping用以下ID:userMap,userMap1 and employeeMapemployeeMap1

问题

请,可能有人解释我这种情况呢?为什么我必须重复映射?或者,可能,我错过了一些设置。

我不想重复我的映射,因为我想重复使用它们。

有没有一个解决方案没有重复这些映射?

+0

我有同样的问题。两个关联使用相同的resultMap定义。这似乎不可能。 – Emerald214

回答

0

所以,前几天我又面临同样的问题,我解决了它。

答案很简单:不要忘记为你的域写正确的等于& hashCode。

我的问题的原因是缺少等于& hashCode方法(或它们不正确),这就是为什么mybatis无法解决哪个对象应该去集合#1或#2。

所以,如果有人对某些细节感兴趣,请告诉我,我会提供一些样品。