iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JPA @ManyToMany报错怎么解决
  • 546
分享到

JPA @ManyToMany报错怎么解决

2023-06-21 23:06:45 546人浏览 八月长安
摘要

本篇内容主要讲解“JPA @ManyToMany报错怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JPA @ManyToMany报错怎么解决”吧!JPA @ManyT

本篇内容主要讲解“JPA @ManyToMany报错怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JPA @ManyToMany报错怎么解决”吧!

JPA @ManyToMany 报错StackOverflowError

在使用 SpringBoot + JPA 的@ManyToMany 遇到了如下报错

java.lang.StackOverflowError: null

2021-02-07 10:59:59.490 ERROR 100440 --- [io-20012-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed;
nested exception is org.springframework.Http.converter.HttpMessageNotWritableException:
Could not write JSON: Infinite recursion (StackOverflowError);
nested exception is com.fasterxml.jackson.databind.jsonMappingException:
Infinite recursion (StackOverflowError) (through reference chain:
com.xxx.entity.boem.EquipmentManage["dataPublishes"]->org.hibernate.collection.internal.PersistentSet[0]
->com.xxx.entity.bods.DataPublish["equipmentManages"]->org.hibernate.collection.internal.PersistentBag[0]
->com.xxx.entity.boem.EquipmentManage["dataPublishes"]->org.hibernate.collection.internal.PersistentSet[0]
->com.xxx.entity.bods.DataPublish["equipmentManages"]->org.hibernate.collection.internal.PersistentBag[0]
->com.xxx.entity.boem.EquipmentManage["dataPublishes"]->org.hibernate.collection.internal.PersistentSet[0]
->.......
..........

注意:

使用@ManyToMany时, 对应的Entity不可使用lombok 的@Data 注解。使用@Setter 、@Getter注解。主要原因是要自己覆写hash() equals(),toString() 方法。这样添加和删除的时候不会出现异常。否则出现循环的引用,不能删除或stackOver;

不能删除和添加成功,出现循环的主要问题在 toString()方法。此方法只能包含基本的元素,不要包含相应的@ManyToMany 的对象 。两个类都是。这样才会ok.

@Setter@Getter@Entitypublic class User {    @Id    @GenericGenerator(name="jpauuid",strategy = "org.hibernate.id.UUIDGenerator")    @GeneratedValue(generator = "jpauuid")    @Column(length = 32,nullable = false)    private String  id;    @Column(length = 30)    private String username;    @ManyToMany(cascade = CascadeType.REFRESH,mappedBy = "users")    private Set<Role> roles;    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        User user = (User) o;        return id.equals(user.id) &&                username.equals(user.username) &&                roles.equals(user.roles);    }    @Override    public int hashCode() {        return Objects.hash(id, username, roles);    }    @Override    public String toString() {        return "User{" +                "id='" + id + '\'' +                ", username='" + username + '\'' +                ", roles=" + roles +                '}';    }}
@Setter@Getter@Entitypublic class Role {    @Id    @GeneratedValue(strategy = GenerationType.AUTO)    private Integer id;    @Column(length = 30)    private String  name;    @ManyToMany(cascade = CascadeType.REFRESH)    @JoinTable(name = "user_role",joinColumns = @JoinColumn(name = "role_id"),inverseJoinColumns = @JoinColumn(name="user_id"))    private Set<User>  users;}

SpringJPA批量删除引起的StackOverFlow

项目里有一处根据Id,批量删除一些历史数据的代码(xxxRepository.deleteInBatch(list);),发现传入list过大时,出现栈溢出(StackOverFlowError) 。

解决方法

list切分成多份,循环批量删除。

下面是简单的了解一下执行流程。

 deleteInBatch(Iterable<T> entities) @Transactionalpublic void deleteInBatch(Iterable<T> entities) { Assert.notNull(entities, "The given Iterable of entities not be null!"); if (!entities.iterator().hasNext()) {return;} // 继续跟踪applyAndBind(getQueryString(DELETE_ALL_QUERY_STRING, entityInfORMation.getEntityName()), entities, em).executeUpdate();}   public static <T> Query applyAndBind(String queryString, Iterable<T> entities, EntityManager entityManager) {   // ... 省略一些code   // 最后会形成 delete from xx表  x(表别名) where x.id =? or x.id=?... 一条sql语句         String alias = detectAlias(queryString);StringBuilder builder = new StringBuilder(queryString);builder.append(" where"); int i = 0; while (iterator.hasNext()) { iterator.next(); builder.append(String.format(" %s = ?%d", alias, ++i)); if (iterator.hasNext()) {builder.append(" or");}} Query query = entityManager.createQuery(builder.toString()); iterator = entities.iterator();i = 0; while (iterator.hasNext()) {query.setParameter(++i, iterator.next());}  }

结合日志记录的错误信息,进入到org.hibernate.hql.internal.antlr.HqlSqlBaseWalker#logicalExpr 方法

JPA @ManyToMany报错怎么解决

下面贴一下调用栈

JPA @ManyToMany报错怎么解决

org.hibernate.hql.internal.antlr.HqlSqlBaseWalker#deleteStatement 方法中 whereClause()调用到了logicalExpr 方法。

由下图可知,该方法在①处递归调用自身,会不断的创建栈帧,当超出栈深度或者超出栈的大小后,会爆出 栈溢出。

至于① 处怎么跳出继续执行后面的代码,还没研究,有知道的小伙伴请指教,不正确的地方也请指正。

JPA @ManyToMany报错怎么解决

到此,相信大家对“JPA @ManyToMany报错怎么解决”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: JPA @ManyToMany报错怎么解决

本文链接: https://www.lsjlt.com/news/301354.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JPA @ManyToMany报错怎么解决
    本篇内容主要讲解“JPA @ManyToMany报错怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JPA @ManyToMany报错怎么解决”吧!JPA @ManyT...
    99+
    2023-06-21
  • JPA @ManyToMany 报错StackOverflowError的解决
    目录JPA @ManyToMany 报错StackOverflowErrorSpringJPA批量删除引起的StackOverFlow解决方法JPA @ManyToMany 报错St...
    99+
    2024-04-02
  • spring data jpa @Query注解中delete语句报错怎么解决
    本篇内容主要讲解“spring data jpa @Query注解中delete语句报错怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring...
    99+
    2023-06-22
  • wordpress报错怎么解决
    wordpress报错解决方法:1、暂时禁用所有插件;2、将主题更改为默认主题;3、 修改wp-config.php文件;4、更新固定链接设置,确保设置正确;5、检查.htaccess文件是否存在且是否可写;6、检查主题的页面模板文件是否存...
    99+
    2023-07-31
  • es报错怎么解决
    本篇文章为大家展示了es报错怎么解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 数据查询范围太大问题场景:订单列表 每页10条 1000页没问题  1001页就会出...
    99+
    2023-06-19
  • Assert.assertEquals报错怎么解决
    今天小编给大家分享一下Assert.assertEquals报错怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前提(...
    99+
    2023-06-30
  • python virtualenv报错怎么解决
    本篇内容主要讲解“python virtualenv报错怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python virtualenv报错怎么解决”吧!在python安装完virtua...
    99+
    2023-06-02
  • mybatis报错resultMapException怎么解决
    这篇文章主要介绍“mybatis报错resultMapException怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mybatis报错resultMapException怎么解决”文章能帮...
    99+
    2023-06-29
  • idea string报错怎么解决
    遇到"idea string报错"通常是由于在代码中使用了字符串操作,但是字符串的定义或者使用不符合语法规则或者逻辑要求,导致IDE...
    99+
    2023-08-14
    idea
  • IDEA报错java.lang.nosuchfielderror怎么解决
    java.lang.NoSuchFieldError表示尝试访问或者使用一个不存在的字段。通常发生在编译时和运行时,可能是由于代码中...
    99+
    2024-03-05
    IDEA
  • oracle报错ora00904怎么解决
    ORA-00904错误是指在SQL语句中使用了无效的列名。要解决这个错误,您可以尝试以下几个方法:1. 检查列名的拼写:确保您在SQ...
    99+
    2023-08-30
    oracle
  • eclipse string报错怎么解决
    要解决Eclipse中的字符串错误,可以尝试以下几种方法:1. 检查引用的字符串是否正确:检查字符串是否正确引用,包括引号是否匹配、...
    99+
    2023-10-09
    eclipse
  • mysql limit报错怎么解决
    当使用MySQL的LIMIT语句报错时,可能是由于以下原因导致的: 语法错误:请检查LIMIT语句的语法是否正确。LIMIT语句...
    99+
    2024-04-09
    mysql
  • php self报错怎么解决
    本篇内容介绍了“php self报错怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php self报错的解决办法:首先打开相应的代码...
    99+
    2023-06-20
  • Python loadlibrary报错怎么解决
    在Python中,loadlibrary函数用于动态加载外部的共享库文件。当出现loadlibrary报错时,可能是以下几种原因导致...
    99+
    2023-09-17
    Python loadlibrary
  • mysql query报错怎么解决
    解决方法:1、仔细阅读错误信息;2、检查SQL语句;3、检查数据库连接;4、检查表结构和数据;5、检查权限;6、使用日志;7、参考文档和社区;8、调试和排查等。当MySQL查询报错时,可以通过以下步骤来解决问题:1. 仔细阅读错误信息:My...
    99+
    2023-10-23
    mysql query
  • mysql version报错怎么解决
    如果 MySQL 报错了,可以尝试以下方法来解决: 确保 MySQL 版本兼容性:检查你的应用程序和数据库服务器的 MySQL ...
    99+
    2024-04-09
    mysql
  • maven clean报错怎么解决
    当出现maven clean报错时,可能是由于项目中产生了一些错误或者不一致的文件,导致maven无法清理项目。以下是一些常见的解决...
    99+
    2024-04-02
  • oracle报错06512怎么解决
    Oracle报错06512是一个常见的错误,通常是由于数据不一致或语法错误导致的。解决此错误的方法如下: 检查SQL语句:检查你...
    99+
    2023-10-26
    oracle
  • oracle报错MISSINGEXPRESSION怎么解决
    ORACLE数据库报错MISSINGEXPRESSION通常是由于SQL语句中存在语法错误导致的。要解决这个问题,可以按照以下步骤进...
    99+
    2023-10-27
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作