java之MyBatis:递归同时映射多个相同类型的关联/集合

birdshome 阅读:28 2023-09-07 20:43:31 评论:0

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

简介。

这是我的数据库模式: simple_db_schema

我有一个简单的类User:

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

然后我有 Employee 类:

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... 
} 

映射

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

用户映射

<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> 

员工映射

<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> 

项目映射

<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”。

问题。

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

DB查询正确。

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

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

一种方法是复制 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:userMapuserMap1employeeMapemployeeMap1

问题

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

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

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

请您参考如下方法:

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

答案很简单:不要忘记为您的域编写正确的 equals 和 hashCode。

我的问题的原因是缺少 equals 和 hashCode 方法(或者它们不正确),这就是为什么 mybatis 无法解析哪个对象应该进入集合 #1 或 #2。

因此,如果有人对某些细节感兴趣,请告诉我,我会提供一些示例。


标签:MyBatis
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号