Mybatis使用時のStackOverflowErrorエラー解決

エラー状態

mybatisを使って練習したとき、私は次の実体関連を確立しました

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

次に、次のように実装される2つの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);

次に、テストを作成し、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