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