MyBatis:映射多个相同类型的关联/集合

时间:2015-10-14 12:57:36

标签: java recursion mapping mybatis ibatis

我在MyBatis中面临一个有趣的问题,在尝试映射两个相同类型的对象集合时会导致递归。

简介

这是我的数据库架构: 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 ”。

问题。

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

对DB的查询是正确的。

我尝试了不同的方法来解决这个问题(我将所有映射放在一个文件中,我在 UserMapping 中删除了 Employee 关联)但是没有任何帮助。

我找到了一个解决方案,但这并不是我想要的。

一种方法是复制 UserMapping EmployeeMapping 并更改其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份 UserMapping EmployeeMapping 以及以下ID: userMap userMap1 employeeMap employeeMap1

问题

拜托,有人能解释一下这种情况吗?为什么我必须复制映射?或者,我可能错过了一些设置。

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

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

1 个答案:

答案 0 :(得分:1)

所以,几天前我又遇到了同样的问题,我已经解决了。

答案很简单:不要忘记写出正确的等号&amp;您域名的hashCode。

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

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