2015-10-14 61 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。

所以,如果有人對某些細節感興趣,請告訴我,我會提供一些樣品。