JPA多對多操作中,Lombok @DATA @EqualsAndHashCode循環依賴問題導致程序StackOverflowError

今天遇到的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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章