pojo
@Data
public class User2 {
private Long id;
private String userName;
private String realName;
private SexEnum sex;
private String mobile;
private String tel;
private String email;
private String note;
// 用户一对多
private List<Role2> roleList;
}
@Data
public class Role2 {
private Long id;
private String roleName;
private String note;
// 角色一对多
private List<User2> userList;
}
Mapper
public interface UserMapper2 {
public User2 getUser(Long id);
public List<User2> findUserByRoleId(Long roleId);
}
public interface RoleMapper2 {
public Role2 getRole(Long id);
public List<Role2> findRoleByUserId(Long userId);
}
xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatis03.mapper2.UserMapper2">
<resultMap id="UserMap" type="mybatis03.pojo2.User2">
<result property="id" column="id"/>
<result property="userName" column="id"/>
<result property="realName" column="id"/>
<result property="sex" column="id" typeHandler="mybatis02.typehandler.SexEnumTypeHandler"/>
<result property="mobile" column="id"/>
<result property="tel" column="id"/>
<result property="email" column="id"/>
<result property="note" column="id"/>
<collection property="roleList" column="id" select="mybatis03.mapper2.RoleMapper2.findRoleByUserId"/>
</resultMap>
<select id="getUser" resultMap="UserMap">
select id, user_name, real_name, sex, moble, email, note from t_user where
id =#{id}
</select>
<select id="findUserByRoleId" resultMap="UserMap">
select
a.*
from
t_user a
left join t_user_role b on a.id =b.user_id
left join t_role2 c on b.role_id =c.id
where
c.id =#{id}
</select>
</mapper>
---------
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatis03.mapper2.RoleMapper2">
<resultMap id="RoleMap" type="mybatis03.pojo2.Role2">
<id property="id" column="id"/>
<result property="roleName" column="role_name"/>
<result property="note" column="note"/>
<collection property="userList" column="id" fetchType="lazy"
select="mybatis03.mapper2.UserMapper2.findUserByRoleId"/>
</resultMap>
<select id="getRole" resultMap="RoleMap">
select id,role_name,note from t_role2 where id=#{id}
</select>
<select id="findRoleByUserId" resultType="mybatis03.pojo2.Role2" >
select
a.*
from
t_role2 a
left join t_user_role b on a.id =b.role_id
left join t_user c on b.user_id =c.id
where
c.id = #{id}
</select>
</mapper>
测试:
public static void getRole2() {
SqlSession sqlSession = null;
try {
Logger logger = Logger.getLogger(mybatis03Test.class);
sqlSession = SqlSessionFactoryUtils.openSqlSession();
RoleMapper2 roleMapper2 = sqlSession.getMapper(RoleMapper2.class);
List<Role2> role2=roleMapper2.findRoleByUserId(1l);
logger.debug(role2);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
执行之后就会报错,堆栈溢出
我也知道他们里面会有嵌套,但是不logger出来是不会报错的,只会出来执行sql,而logger之后就会堆栈溢出。
我目前是把xml文件collection元素中的select换成了oftype
<resultMap id="RoleMap" type="mybatis03.pojo2.Role2">
<id property="id" column="id"/>
<result property="roleName" column="role_name"/>
<result property="note" column="note"/>
<collection property="userList" column="id" fetchType="lazy" ofType="mybatis03.pojo2.User2"/>
<!-- select="mybatis03.mapper2.UserMapper2.findUserByRoleId"/>-->
</resultMap>
按照原先的xml文件怎么去解决堆栈溢出的问题呢?
对象之间互相嵌套,打印会一直递归,可以用json序列化后打印,忽略掉重复属性