エラー状態
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仮想マシンスタックは常に再帰のために爆発しました。。。だから楽しいです、これはこのようにすることはできません。