Не удалось лениво инициализировать коллекцию ролей. Простой JPA findById - PullRequest
0 голосов
/ 02 апреля 2020

Я использую Spring и JPA (Hibernate с MySQL) и Lombok.

Привет, у меня есть эта часть моих сущностей:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "entitya")
public class EntityA  implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="ea_id")
    Long id;
    ....

    @ManyToOne
    @JoinColumn(name="g_id", nullable=false)
    private Group group;

    ....
}

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Entity
    @Table(name = "group")
    public class Group implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name="g_id")
        private Long id;

        @OneToMany(mappedBy="group")
        private List<EntityA> enitiesA = new ArrayList<>();

        ...
    }

Я реализовал также расширение репозитория JPARepository. В мои контроллеры, если я пытаюсь получить EntityA по Id, я получаю следующее исключение:

failed to lazily initialize a collection of role: com.mytest.entity.Group.enitiesA, could not initialize proxy - no Session

Для меня это странно, потому что мне нужно извлечь только объект. Я не использую некоторые методы получения. Итак, теоретически, используя типы выборок по умолчанию, мне не нужно иметь также список групп.

Что не так?

Ответы [ 2 ]

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

Вероятно, это потому, что вы обращаетесь к group.enitiesA за пределами транзакционных границ. Если вы хотите сделать это, вы можете получить их, добавив в свой список OneToMany такой тип загрузки, как

@OneToMany(mappedBy="group", fetch = FetchType.EAGER)

. При загрузке родительского объекта будет загружен весь граф объекта.

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

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

Вы отлаживаете свой объект с помощью toString ()?

В случае, если это может быть ошибка, вызванная аннотацией @Data.

Сгенерированный метод toString () содержит все поля, поэтому он может вызвать переменную enitiesA, что приведет к ленивой ошибке инициализации.

https://mdeinum.github.io/2019-02-13-Lombok-Data-Ojects-Arent-Entities/

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