javax.servlet.ServletException: выполнение фильтра вызвало исключение java .lang.StackOverflowError Struts - PullRequest
0 голосов
/ 19 апреля 2020

Вот мой код сущности,

package com.javaimplant.socialnetwork.model;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name="users")
public class User {

    @Id
    @Column(name="Id")
    @GenericGenerator(name="inc",strategy = "increment")
    @GeneratedValue(generator = "inc")
    private Integer id;

    @Column(name="name")
    private String userName;

    @Column(name="password")
    private String password;

    @OneToMany(fetch=FetchType.EAGER)
    private List<User> friends= new ArrayList<>();

    public List<User> getFriends() {
        return friends;
    }

    public void setFriends(List<User> friends) {
        this.friends = friends;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

Я хочу установить связь @OneToMany, чтобы пользователь мог выбирать в качестве своих друзей в приложении для социальных сетей. Когда я комментирую атрибут друзей и его методы получения и установки, все работает нормально. Теперь, когда я добавляю этот атрибут, я получаю следующее исключение.

Вот трассировка стека,

java.lang.StackOverflowError
org.hibernate.metamodel.mapping.internal.PluralAttributeMappingImpl$$Lambda$228/666804214.<init>(Unknown Source)
org.hibernate.metamodel.mapping.internal.PluralAttributeMappingImpl$$Lambda$228/666804214.get$Lambda(Unknown Source)
org.hibernate.metamodel.mapping.internal.PluralAttributeMappingImpl.generateFetch(PluralAttributeMappingImpl.java:363)
org.hibernate.loader.ast.internal.LoaderSelectBuilder.lambda$visitFetches$5(LoaderSelectBuilder.java:431)
java.util.ArrayList.forEach(Unknown Source)
org.hibernate.persister.entity.AbstractEntityPersister.visitFetchables(AbstractEntityPersister.java:6174)
org.hibernate.loader.ast.internal.LoaderSelectBuilder.visitFetches(LoaderSelectBuilder.java:460)
org.hibernate.loader.ast.internal.LoaderSqlAstCreationState.visitFetches(LoaderSqlAstCreationState.java:131)
org.hibernate.sql.results.graph.AbstractFetchParent.afterInitialize(AbstractFetchParent.java:31)
org.hibernate.sql.results.graph.entity.internal.EntityResultImpl.<init>(EntityResultImpl.java:52)
org.hibernate.sql.results.graph.entity.internal.EntityResultImpl.<init>(EntityResultImpl.java:34)
org.hibernate.sql.results.graph.entity.internal.EntityFetchJoinedImpl.<init>(EntityFetchJoinedImpl.java:40)
org.hibernate.metamodel.mapping.internal.EntityCollectionPart.generateFetch(EntityCollectionPart.java:130)
org.hibernate.metamodel.mapping.internal.EntityCollectionPart.generateFetch(EntityCollectionPart.java:36)
org.hibernate.loader.ast.internal.LoaderSelectBuilder.lambda$visitFetches$5(LoaderSelectBuilder.java:431)
org.hibernate.metamodel.mapping.PluralAttributeMapping.visitFetchables(PluralAttributeMapping.java:54)
org.hibernate.loader.ast.internal.LoaderSelectBuilder.visitFetches(LoaderSelectBuilder.java:460)
org.hibernate.loader.ast.internal.LoaderSqlAstCreationState.visitFetches(LoaderSqlAstCreationState.java:131)
org.hibernate.sql.results.graph.collection.internal.EagerCollectionFetch.<init>(EagerCollectionFetch.java:77)
org.hibernate.metamodel.mapping.internal.PluralAttributeMappingImpl.generateFetch(PluralAttributeMappingImpl.java:390)
org.hibernate.loader.ast.internal.LoaderSelectBuilder.lambda$visitFetches$5(LoaderSelectBuilder.java:431)
java.util.ArrayList.forEach(Unknown Source)

Вот как определяется моя база данных,

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `password` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;


CREATE TABLE `users_users` (
  `user_id` int(11) NOT NULL,
  `friends_id` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

1 Ответ

0 голосов
/ 19 апреля 2020

Вам нужно закрыть l oop. Если A является другом B, это означает, что B также является другом A, поэтому он будет пытаться найти друзей, пока не выбросит переполнение стека. Измените тип выборки с EAGER на LAZY.

Я не знаю, как вы управляете Hibernate Session в Struts (пожалуйста, включите некоторый код и конфигурацию), но в конечном итоге вся работа, которую вы должны выполнить, должна выполняться в течение сеанса. , Независимо от структуры, вот как она обычно работает:

Вы начинаете с транзакции. По умолчанию контекстом вашего сеансового контекста Hibernate является Транзакция, что означает, что сеанс закрывается, когда транзакция фиксируется. (Вы можете изменить это. См. Контекстный сеанс ). Если вы не запускаете транзакцию явно, то Hibernate создаст ее для вас.

Если вы выполняете всю свою работу во время сеанса откройте, тогда вы не столкнетесь с какими-либо исключениями для отложенной инициализации. Я думаю, в вашем случае ваше решение состоит в том, чтобы начать собственную транзакцию, выполнить работу, а затем зафиксировать транзакцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...