JPA多对多操作中,Lombok @DATA @EqualsAndHashCode循环依赖问题导致程序StackOverflowError

2 篇文章 0 订阅

今天遇到的jpa出现内存溢出,并且在对集合转换时日志多条警告并且出现异常

错误
elAdmin- 2019-03-15 16:30:05 [http-nio-8000-exec-1] WARN  o.h.e.loading.internal.LoadContexts - HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@3f4d7874<rs=com.alibaba.druid.pool.DruidPooledResultSet@45d32798>
elAdmin- 2019-03-15 16:30:05 [http-nio-8000-exec-1] WARN  o.h.e.loading.internal.LoadContexts - HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@2b391bf<rs=com.alibaba.druid.pool.DruidPooledResultSet@28b56317>
elAdmin- 2019-03-15 16:30:05 [http-nio-8000-exec-1] WARN  o.h.e.loading.internal.LoadContexts - HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@8d93114<rs=com.alibaba.druid.pool.DruidPooledResultSet@6f1ee21d>
elAdmin- 2019-03-15 16:30:05 [http-nio-8000-exec-1] WARN  o.h.e.loading.internal.LoadContexts - HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@2faf2ba6<rs=com.alibaba.druid.pool.DruidPooledResultSet@51ba061d>
elAdmin- 2019-03-15 16:30:05 [http-nio-8000-exec-1] WARN  o.h.e.loading.internal.LoadContexts - HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@7b7568ff<rs=com.alibaba.druid.pool.DruidPooledResultSet@688e471f>
elAdmin- 2019-03-15 16:30:05 [http-nio-8000-exec-1] WARN  o.h.e.loading.internal.LoadContexts - HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@65d52047<rs=com.alibaba.druid.pool.DruidPooledResultSet@4fdc4421>
elAdmin- 2019-03-15 16:30:05 [http-nio-8000-exec-1] WARN  o.h.e.loading.internal.LoadContexts - HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@2445ec78<rs=com.alibaba.druid.pool.DruidPooledResultSet@3c79db27>
elAdmin- 2019-03-15 16:30:05 [http-nio-8000-exec-1] WARN  o.h.e.loading.internal.LoadContexts - HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@7261114d<rs=com.alibaba.druid.pool.DruidPooledResultSet@d53e52b>
elAdmin- 2019-03-15 16:30:05 [http-nio-8000-exec-1] WARN  o.h.e.loading.internal.LoadContexts - HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@2203bd6e<rs=com.alibaba.druid.pool.DruidPooledResultSet@668512ae>
elAdmin- 2019-03-15 16:30:05 [http-nio-8000-exec-1] WARN  o.h.e.loading.internal.LoadContexts - HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@6e187671<rs=com.alibaba.druid.pool.DruidPooledResultSet@78b8933>
elAdmin- 2019-03-15 16:30:05 [http-nio-8000-exec-1] WARN  o.h.e.loading.internal.LoadContexts - HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@65b561e6<rs=com.alibaba.druid.pool.DruidPooledResultSet@c3bfbb8>
elAdmin- 2019-03-15 16:30:05 [http-nio-8000-exec-1] WARN  o.h.e.loading.internal.LoadContexts - HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@1f24ff64<rs=com.alibaba.druid.pool.DruidPooledResultSet@8b15bb8>
elAdmin- 2019-03-15 16:30:05 [http-nio-8000-exec-1] WARN  o.h.e.loading.internal.LoadContexts - HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@20f3d923<rs=com.alibaba.druid.pool.DruidPooledResultSet@138150ba>
ERROR o.w.e.handler.GlobalExceptionHandler - org.wuyd.exception.BadRequestException: Failed to convert from type [java.util.ArrayList<?>] to type [java.util.Set<?>] for value '[Role{id=1, name='管理员', remark='系统所有权', createDateTime=2018-11-23 11:04:37.0}]'; nested exception is java.lang.StackOverflowError

该问题是由于@EqualsAndHashCode 在role, permiss两个类中的

    @ManyToMany
    @JoinTable(name = "roles_permissions", joinColumns = {@JoinColumn(name = "role_id",referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "permission_id",referencedColumnName = "id")})
    private Set<Permission> permissions;

    @ManyToMany
    @JoinTable(name = "roles_menus", joinColumns = {@JoinColumn(name = "role_id",referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "menu_id",referencedColumnName = "id")})
    private Set<Menu> menus;

@ManyTOMany 时 Lombok 生成的HashCode 会导致两个集合循环比较,造成内存溢出

解决方案是:
  • 自己手写hashcode 不要用lombok中的@Data和@hashcode
    Alt
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值