MyBatis:递归同时映射多个 association/collection 相同类型
MyBatis: recursion while mapping more than one association/collection of the same type
我在 MyBatis 中遇到了一个有趣的问题,它导致在尝试映射两个相同类型的对象集合时出现递归。
简介。
这是我的数据库模式:
simple_db_schema
我有一个简单的class用户:
public class User {
private Long id;
private String login;
private String password;
private Employee employee;
// Constructors, setters and getters go here...
}
然后我有class员工:
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>
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”.
问题。
使用这种方法我的映射不起作用。
在 Employee 中映射 User 没有问题,反之亦然 - 工作正常。
DB查询正确
我尝试了不同的方法来解决这个问题(我将所有映射放在一个文件中,我删除了 Employee 关联 UserMapping ) 但仍然没有任何帮助。
我找到了一种解决方案,但这并不是我想要的。
一种方法是复制 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.
问题
拜托,谁能给我解释一下这种情况?为什么我必须复制映射?或者,可能是我遗漏了一些设置。
我不想复制我的映射,因为我想重复使用它们。
有没有不复制这些映射的解决方案?
所以,几天前我又遇到了同样的问题,我已经解决了。
答案很简单:不要忘记为您的域编写正确的 equals 和 hashCode。
我的问题的原因是缺少 equals 和 hashCode 方法(或者它们不正确),这就是为什么 mybatis 无法解析哪个对象应该进入集合 #1 或 #2。
所以,如果有人对某些细节感兴趣,请告诉我,我会提供一些示例。
我在 MyBatis 中遇到了一个有趣的问题,它导致在尝试映射两个相同类型的对象集合时出现递归。
简介。
这是我的数据库模式: simple_db_schema
我有一个简单的class用户:
public class User {
private Long id;
private String login;
private String password;
private Employee employee;
// Constructors, setters and getters go here...
}
然后我有class员工:
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>
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”.
问题。
使用这种方法我的映射不起作用。 在 Employee 中映射 User 没有问题,反之亦然 - 工作正常。
DB查询正确
我尝试了不同的方法来解决这个问题(我将所有映射放在一个文件中,我删除了 Employee 关联 UserMapping ) 但仍然没有任何帮助。
我找到了一种解决方案,但这并不是我想要的。
一种方法是复制 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.
问题
拜托,谁能给我解释一下这种情况?为什么我必须复制映射?或者,可能是我遗漏了一些设置。
我不想复制我的映射,因为我想重复使用它们。
有没有不复制这些映射的解决方案?
所以,几天前我又遇到了同样的问题,我已经解决了。
答案很简单:不要忘记为您的域编写正确的 equals 和 hashCode。
我的问题的原因是缺少 equals 和 hashCode 方法(或者它们不正确),这就是为什么 mybatis 无法解析哪个对象应该进入集合 #1 或 #2。
所以,如果有人对某些细节感兴趣,请告诉我,我会提供一些示例。