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的虚拟机栈爆了,因为一直递归。。。所以就很好玩,这个不能这么搞。

猜你喜欢

转载自blog.csdn.net/qq_34687559/article/details/110500385