Mybatis使用中StackOverflowError错误解决

错误情况

在我进行mybatis的使用练习时,建立了如下的实体类关系

User{userId,  List<Account> accounts}
Account{id,uid, User user}

然后有两个Dao接口,实现的方法如下:
IUserDao

/**
     * 查询所有用户
     * @return
     * 在mybatis中针对crud有四个注解
     * @SELECT,@UPDATE @INSERT @DELETE
     */
    @Select(value = "select * from user")
    @Results(id="userMap", value = {
            @Result(id=true,column = "id",property = "userId"),
            @Result(column = "username",property = "userName"),
            @Result(column = "birthday",property = "userBirthday"),
            @Result(column = "sex",property = "userSex"),
            @Result(column = "address",property = "userAddress"),
            @Result(column = "id", property = "accounts", many = @Many(select = "com.itheima.dao.IAccountDao.findByUid",fetchType = FetchType.LAZY)),
    })
    List<User> findAll();

/**
     * 根据id查询用户
     * @param userId
     * @return
     */
    @Select("select * from user where id=#{userId}")
    @ResultMap(value = {"userMap"})
    User findById(Integer userId);

IAccountDao

/**
     * 查询素有账户,并连带着返回相应的用户,实现一对一
     * @return
     */
    @Select("select * from account")
    @Results(id="accountMap", value = {
            @Result(id=true,column = "id",property = "id"),
            @Result(column = "uid",property = "uid"),
            @Result(column = "money",property = "money"),
            @Result(column = "uid",property = "user",one = @One(select = "com.itheima.dao.IUserDao.findById",fetchType = FetchType.EAGER)),

    })
    List<Account> findAll();
    
/**
     * 根据用户id查询账户
     * @param userId
     * @return
     */
    @Select(value = "select * from account where uid=#{userId}")
    @ResultMap(value = {"accountMap"})
    List<Account> findByUid(Integer userId);

然后我建了test,然后调用accountDao.findByUid()方法,然后就报了下面的错

java.lang.StackOverflowError
	at java.base/java.lang.String.indexOf(String.java:1589)
	at java.base/java.lang.String.indexOf(String.java:1546)
	at java.base/java.net.URLStreamHandler.parseURL(URLStreamHandler.java:143)
	at java.base/sun.net.www.protocol.file.Handler.parseURL(Handler.java:67)
	at java.base/java.net.URL.<init>(URL.java:656)
	at java.base/java.net.URL.<init>(URL.java:523)
	at java.base/jdk.internal.loader.URLClassPath$FileLoader.getResource(URLClassPath.java:1067)
	at java.base/jdk.internal.loader.URLClassPath.getResource(URLClassPath.java:244)
	at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:696)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:622)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
	at org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl.invoke(JavassistProxyFactory.java:159)
	at com.itheima.domain.User_$$_jvst671_0.toString(User_$$_jvst671_0.java)

原因何在

然后我想了一会儿,发现了原因,原因太好玩了,我套娃了。
IAccountDao.findAccount()与IUserDao.findById()互相调用了,所以一直在进行下去,结果导致java的虚拟机栈爆了,因为一直递归。。。所以就很好玩,这个不能这么搞。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值