org.hibernate.lazyinitializationexception после вызова getter для ленивого инициализированного поля - PullRequest
0 голосов
/ 30 мая 2019

У меня есть запись класса с ленивым комментарием поля инициализации:

@Entity
@Table(name = "POSTS")
public class Post {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "post_id",
            unique = true, nullable = false)
    @JsonView(Views.Public.class)
    private Integer postId;

    @Column(name = "POST_BODY", columnDefinition = "text")
    @JsonView(Views.Public.class)
    private String postBody;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "USERNAME")
    private User user;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "post", fetch = FetchType.LAZY)
    private Set<PostComment> comments = new HashSet<>();
}

Как я узнал из hibernate docs, если что-то не инициализируется из-за отложенной инициализации, если вы затем вызываете его метод getter, оно должно быть инициализировано, но когда я получаю свое сообщение и пытаюсь вызвать метод getter для комментариев, я получаю исключение.

@GetMapping(path = {"/post/{id}"})
    public ModelAndView showSpecificPost(@PathVariable(value = "id") Integer id) {
        User currentUser = userService.findByUserName(auth.getName());
        Post post = postService.getPostById(id);
        logger.info(post.getComments().size());
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("postTemplates/specificPost");

        return modelAndView;
    }

1 Ответ

1 голос
/ 30 мая 2019

Скорее всего, транзакция выполняется по этому методу:

Post post = postService.getPostById(id);

Затем вы пытаетесь:

logger.info(post.getComments().size());

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

Один из вариантов для вас - аннотировать метод отображения запроса контроллера с помощью @Transactional(readOnly = true).

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